多線程-線程的創建

創建多線程的第一種方式:Thread類


//繼承Thread類,並重寫Thread類中的run()方法。

class ThreadCreate extends Thread{
	//public static void main(String [] args){  沒有必要寫主函數,編譯還是可以通過的
	private int i = 0;//初始化的值,應該考慮到輸出幾次,如果從最大值開始考慮,for循環裏面用的應該是i--
	@Override//嚴格區分大小寫
	public void run(){//run()方法的方法體,代表了要運行的任務,稱之爲線程執行體
		for(int i = 0;i < 20;i++){
			if(i == 11){//等於"11",以便標識,下面的文字也是同理
				System.out.println(Thread.currentThread().getName()+"..."+i+"這是run()方法控制的輸出語句");
			}
		}
	}
		
	//}
}

//運行代碼
class ThreadRun{
	/*
	public static void main(String [] args){
		ThreadCreate t = new ThreadCreate();
		t.run();
	}
	
	這個只是調用了run()方法
	*/
	
	public static void main(String [] args){
		for(int i = 0;i < 20;i++){
			//System.out.println(Thread.currentThread().getName()+"..."+i);
			
			if(i == 10){//也就是說,if控制的對象其實並不是主線程,而是,確保在新的線程在主線程中只執行一次
				//System.out.println(Thread.currentThread().getName()+"..."+i);
				/*如果代碼放到了這個位置,主線程只會輸出main...10,而其他線程仍然輸出至19,說明if語句並沒有
				控制其他線程,其他線程執行的內容爲線程執行體
				*/
				
				Thread t1 = new ThreadCreate();//線程進入新建狀態
				Thread t2 = new ThreadCreate();
				
				t1.start();//線程進入就緒狀態
				t2.start();
				
				System.out.println(Thread.currentThread().getName()+"..."+i+"這是主線程控制的輸出語句");
				/*本來以爲其他線程沒有受if控制,是因爲線程沒有創建,但最終的執行結果和上面一樣。
				引:所以如果真的理解"線程執行體"的概念,應該在run()方法的任務裏,對語句進行控制。
				
				輸出結果:
				
				Thread-0...11這是run()方法控制的輸出語句
				Thread-1...11這是run()方法控制的輸出語句
				main...10這是主線程控制的輸出語句

				*/
			}
		}
	}
}

創多線程的第二種方式:Runnable接口

/*利用Runnable接口來實現多線程的創建*/

//創建一個類實現Runnable接口
class MyRunnable implements Runnable{
	private int i = 0;
	public void run(){//該run()方法仍然是線程的執行體
		for(i = 0;i < 20;i++){
		System.out.println(Thread.currentThread().getName()+"..."+i);
		}	
	}
}

//執行代碼
class RunnableTest{
	public static void main(String [] args){
		for(int i = 0;i < 20;i++){
			System.out.println(Thread.currentThread().getName()+"..."+i);
			if(i == 15){
				Runnable r1 = new MyRunnable();
				Runnable r2 = new MyRunnable();//Runnable接口指向子類對象
				
				Thread t1 = new Thread(r1);//Runnalbe的子類實現作爲參數,Thread類重載的構造函數進行初始化,創建對象t1
				Thread t2 = new Thread(r2);
			
				t1.start();
				t2.start();//最後還是通過Thread對象進入線程就緒狀態
			}
		}
		

	}
}
兩者的區別:
class MyRunnable implements Runnable{
	private int i = 0;
	public void run(){
		System.out.println("MyRunnable...run...");
		for(i = 0;i < 20;i++){
			System.out.println(Thread.currentThread().getName()+"..."+i);
		}
	}

}

class MyThread extends Thread{
	private int  i = 0;
	
	public MyThread(Runnable r){//Thread類裏其實有一個以Runnable爲參數的構造函數
		super(r);//顯式的super(r);
	}
	
	public void run(){
		System.out.println("MyThread...run...");//通過輸出發現執行的是MyThread裏的run()方法
		for(i = 0;i < 20;i++){
			System.out.println(Thread.currentThread().getName()+"..."+i);
		}
	}
}
class ThreadAndRunnable{
	public static void main(String [] args){
		for(int i = 0;i < 20;i++){
			System.out.println(Thread.currentThread().getName()+"..."+i);
			if(i == 15){
				Runnable r = new MyRunnable();
				Thread t = new MyThread(r);
				
				t.start();
			}
		}
	}
}
查看API:


Thread類中對Runnable接口中的方法run()的實現:

@Override
public void run(){
	if(target != null){
		target.run();
	}
}

當執行到Thread類的run()方法的時候,首先會判斷target是否存在,存在則執行run()方法,也就是實現了Runnable接口並重寫run()方法。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章