關於Java的多線程的創建

一.線程的概念:

線程(thread),又叫輕量級的進程(Lightweight Process, LWP),它包括線程ID,當前指令指針,寄存器集合和堆棧.

在java中可以把一個程序轉換成多個獨立的子任務,每個子任務可以比喻爲一個線程.強大的操作系統會有自動分割CPU的制度.爲每個線程做調度.注意(一般考慮)在單CPU模式下,同個時間點只能運行一個線程,只不過由於CPU的高速切換,在一個時間段可以不斷跳轉多個線程,所以用戶感覺像是多個線程同時進行,其實這稱之爲進程的併發.

在單個程序中同時運行多個線程完成不同任務叫做多線程.

進程的狀態: 

(此圖出自馬士兵尚學堂視頻教程)

二.線程的狀態:

在java中我們可以大概分爲:新建(New),就緒(Runnable),運行(Running),死亡(Dead),阻塞(Blocked)五個狀態

  • 新建 : 線程對象創建成功,還爲調用start()方法,則未獲取系統資源
  • 就緒 : 已經調用了start()方法,該狀態可以和運行狀態相互切換,任何狀態的線程要運行必須先處於就緒狀態.
  • 運行 : 此刻線程已經被CPU分配時間.
  • 阻塞 : "當線程調用了自身的sleep()方法或其他線程的join()方法,就會進入阻塞狀態(該狀態既停止當前線程,但並不釋放所佔有的資源)。當sleep()結束或join()結束後,該線程進入可運行(就緒)狀態,繼續等待OS分配時間片"-------此引用來源(http://bbs.csdn.net/topics/350226555)
  • 死亡 : 線程被JVM線程調度收回,再也不會被重新調度執行
三.線程的創建:

Java中有兩種方法創建新線程

1.實現Runnable接口,重寫其中的Run函數,其中用到了多態

public class Thread_test {
	public static void main(String[] args) throws InterruptedException 
	{
		//方法1
		Run r = new Run();			//創建重寫Runnable 接口的Run對象r	
		Thread t1 = new Thread(r);	//通過Thread 構造函數傳進去r對象 實例化一個對象t1
		t1.start();					//通過t1調用start()方法
		
		//方法2
		/*Run2 r2 = new Run2();	
		r2.start();*/
		for(int i=0;i<20;i++)
		{
			System.out.println("MainThread:"+i+" is running.");
			Thread.sleep(100);		//在哪個線程裏調用就讓哪個線程睡眠(此處睡眠主線程)
		}
	}
}	
	class Run implements Runnable {	//Run實現了Runnable接口的run方法 用到了多態(推薦使用)
		public void run() {
			for(int i=0;i<20;i++)
			{
				System.out.println("LittleThread:"+i+" is running.");
				  try {
					    Thread.sleep(100);	//在哪個線程裏調用就讓哪個線程睡眠(此處睡眠little線程)
					} catch (InterruptedException e) {
					     e.printStackTrace();
					}
			}
		}
}	
執行結果 :   實現main()方法中的主線程和新進程併發執行,由於在一個CPU時間片裏就執行完畢,我給每個線程加了個sleep();[注意拋出睡眠中斷異常] , 方便觀察其併發執行的狀態.



2.第二種方法是直接繼承JAVA中的Thread類:

public class Thread_test {
	public static void main(String[] args) throws InterruptedException 
	{
		//方法2
		Run2 r2 = new Run2();	
		r2.start();<span style="white-space:pre">		</span>//由於Run2直接繼承Thread 所以可以直接調用start();
		for(int i=0;i<20;i++)
		{
			System.out.println("MainThread:"+i+" is running.");
			Thread.sleep(100);		//在哪個線程裏調用就讓哪個線程睡眠(此處睡眠主線程)
		}
	}
}		
	class Run2 extends Thread{	//直接建立一個繼承了Thread的方法,可直接用對像start新線程  方法2
		public void run() {
			for(int i=0;i<20;i++)
			{
				System.out.println("LittleThread:"+i+" is running.");
				  try {
					    Thread.sleep(100);
					} catch (InterruptedException e) {
					     e.printStackTrace();
					}
			}
		}
}
運行結果:同上.


運行IDE: Eclipse_Mars 

OS:Win7

參考資料:Java程序設計高級教程(趙卓君主編)、馬士兵尚學堂視頻教程




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