多線程

1. 多線程概念。併發和並行的概念。java

多線程指的是一段時間內cpu同時執行多個線程。一個程序至少運行>=1個進程,進程就是運行中的程序,而一個進程至少運行>=1個線程,線程是操做系統能調度的最小運行單位。一個CPU在同一時刻只能運行一個線程,只是切換比較快速讓人以爲一小段時間內運行了多個線程的錯覺,也就是併發運行。若是要真正達到同一時刻運行多個線程的效果,安裝>=1個CPU就能解決,這個時候就是多個線程並行執行。多線程

2.多線程由誰來調度?誰來劃分優先級?併發

多線程由操做系統來調度,具體是操做系統的線程調度器來調度劃分優先級,即執行的前後順序。spa

3.線程的狀態有幾種?分別是什麼?操作系統

建立狀態----就緒狀態------運行狀態---------阻塞狀態(休眠狀態)--------死亡狀態-------銷燬回收資源線程

4.實現線程間狀態切換的方法:code

new:  用new 實例化繼承thread類的子類或者實現了Runnable接口的子類就建立了一個線程。對象

建立----就緒:調用Thread的start()方法。繼承

就緒---運行:系統準備好資源排列好優先級,到達順序他就會自動執行。接口

運行---就緒:Thread類的靜態方法yield(),當前線程放棄這一次的執行機會回到就緒狀態,和其餘線程競爭下一次運行。

運行---阻塞:Thread的sleep(毫秒)靜態方法讓線程休眠指定時間,Object的wait()方法。

阻塞---運行:sleep(毫秒)到了時間就會甦醒又開始運行。

運行---死亡:不推薦用stop()方法了,在run()方法體設置公用變量來進行是否運行的判斷來決定是否終止。

5.線程如何建立?

寫一個繼承Thread類的子類並重寫它的run()方法,初始化它,調用start()方法就會自動執行run方法體。

實現接口Runnable的子類並實現Runnable的run()方法,經過實例化某個 Thread 實例並將自身做爲運行目標,就能夠運行實現 Runnable 的類而無需建立 Thread 的子類,Thread(Runnable  r),Thread(Runnable r,String threadname t).

多線程的實例:

背景:描述隋朝末年隋朝軍隊和農民起義軍之間的戰爭,主角程咬金幫助農民起義軍發起進攻戰勝了隋朝軍隊,用一個舞臺線程來展示他們的故事,另隋朝軍隊一個線程,農民起義軍一個線程,程咬金一個線程。代碼來源:慕課網某課程老師。

舞臺線程:

package myThread;

public class stageThread extends Thread {
	
	public void run(){
		ArmyThread army=new ArmyThread();
		ArmyThread farmer=new ArmyThread();
		Thread armyThread=new Thread(army, "隋朝軍隊");
		Thread farmerThread=new Thread(farmer,"農民起義軍");
		chengHeroThread cheng=new chengHeroThread();
		cheng.setName("程咬金");

		farmerThread.start();
		armyThread.start();
		try {
			Thread.sleep(30);//舞臺線程休眠讓另兩個線程運行完
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		army.stop=true;
		farmer.stop=true;
		System.out.println(cheng.getName()+"登場");

		cheng.start();
	    try {
			cheng.join();//等待該線程終止才結束本線程。
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
     public static void main(String[] args) {
 		System.out.println("舞臺大幕徐徐拉開,精彩好戲將要上映!");

    	stageThread stage=new stageThread();
    	try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	stage.start();
    	
     }
}

隋朝軍隊和農民起義軍:

public class ArmyThread implements Runnable {
   public boolean stop=false;
   public void run() {
		// TODO Auto-generated method stub
	   while(!stop){
	   for(int i=1;i<6;i++){
	       System.out.println(Thread.currentThread().getName()+"進攻對方"+i+"次!");
	 	   Thread.yield();//暫停當前正在執行的線程對象,並執行其餘線程。
	       }
	   }
	   System.out.println(Thread.currentThread().getName()+"中止進攻!");
	}
    
}

程咬金:

public class chengHeroThread extends Thread {

	public void run() {
		// TODO Auto-generated method stub
		 for(int i=1;i<10;i++)
		   System.out.println("程咬金髮起對隋朝軍隊的攻擊"+i+"次!");
		   System.out.println("程咬金中止進攻!");
		   System.out.println("戰爭結束,農民起義軍戰勝隋朝軍隊!");
	}
}
相關文章
相關標籤/搜索