閱讀761 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java多線程--認識多線程(Thread、Runnable)

1、進程與線程

dos係統:單進程。隻能有一個程序獨自運行,其他程序無法運行。
windows係統:多進程。同一時間段上有多個程序同時運行。



2、java的多線程實現

在java中實現多線程可以采用兩種方式:
繼承Thread類。
實現Runnable接口。

3、Thread類


java.lang包會在程序運行時自動導入,所以不用編寫import語句。
class MyThread extends Thread{	// 繼承Thread類,作為線程的實現類
	private String name ;		// 表示線程的名稱
	public MyThread(String name){
		this.name = name ;		// 通過構造方法配置name屬性
	}
	public void run(){	// 覆寫run()方法,作為線程 的操作主體
		for(int i=0;i<10;i++){
			System.out.println(name + "運行,i = " + i) ;
		}
	}
};
以上完成了一個線程的操作類,然後直接使用此類就可以完成功能。
class MyThread extends Thread{	// 繼承Thread類,作為線程的實現類
	private String name ;		// 表示線程的名稱
	public MyThread(String name){
		this.name = name ;		// 通過構造方法配置name屬性
	}
	public void run(){	// 覆寫run()方法,作為線程 的操作主體
		for(int i=0;i<10;i++){
			System.out.println(name + "運行,i = " + i) ;
		}
	}
};
public class ThreadDemo01{
	public static void main(String args[]){
		MyThread mt1 = new MyThread("線程A ") ;	 // 實例化對象
		MyThread mt2 = new MyThread("線程B ") ;	 // 實例化對象
		mt1.run() ;	// 調用線程主體
		mt2.run() ;	// 調用線程主體
	}
};
程序的運行效果:
class MyThread extends Thread{	// 繼承Thread類,作為線程的實現類
	private String name ;		// 表示線程的名稱
	public MyThread(String name){
		this.name = name ;		// 通過構造方法配置name屬性
	}
	public void run(){	// 覆寫run()方法,作為線程 的操作主體
		for(int i=0;i<10;i++){
			System.out.println(name + "運行,i = " + i) ;
		}
	}
};
public class ThreadDemo02{
	public static void main(String args[]){
		MyThread mt1 = new MyThread("線程A ") ;	 // 實例化對象
		MyThread mt2 = new MyThread("線程B ") ;	 // 實例化對象
		mt1.start() ;	// 調用線程主體
		mt2.start() ;	// 調用線程主體
	}
};
class MyThread extends Thread{	// 繼承Thread類,作為線程的實現類
	private String name ;		// 表示線程的名稱
	public MyThread(String name){
		this.name = name ;		// 通過構造方法配置name屬性
	}
	public void run(){	// 覆寫run()方法,作為線程 的操作主體
		for(int i=0;i<10;i++){
			System.out.println(name + "運行,i = " + i) ;
		}
	}
};
public class ThreadDemo03{
	public static void main(String args[]){
		MyThread mt1 = new MyThread("線程A ") ;	 // 實例化對象
		mt1.start() ;	// 調用線程主體
		mt1.start() ;	// 錯誤
	}
};

4、實現Runnable接口


class MyThread implements Runnable{	// 實現Runnable接口,作為線程的實現類
	private String name ;		// 表示線程的名稱
	public MyThread(String name){
		this.name = name ;		// 通過構造方法配置name屬性
	}
	public void run(){	// 覆寫run()方法,作為線程 的操作主體
		for(int i=0;i<10;i++){
			System.out.println(name + "運行,i = " + i) ;
		}
	}
};
class MyThread implements Runnable{	// 實現Runnable接口,作為線程的實現類
	private String name ;		// 表示線程的名稱
	public MyThread(String name){
		this.name = name ;		// 通過構造方法配置name屬性
	}
	public void run(){	// 覆寫run()方法,作為線程 的操作主體
		for(int i=0;i<10;i++){
			System.out.println(name + "運行,i = " + i) ;
		}
	}
};
public class RunnableDemo01{
	public static void main(String args[]){
		MyThread mt1 = new MyThread("線程A ") ;	 // 實例化對象
		MyThread mt2 = new MyThread("線程B ") ;	 // 實例化對象
		
		Thread t1 = new Thread(mt1) ;		// 實例化Thread類對象
		Thread t2 = new Thread(mt2) ;		// 實例化Thread類對象
		t1.start() ;	// 啟動多線程
		t2.start() ;	// 啟動多線程
	}
};
運行效果:

5、Thread類與Runnable接口的聯係


從定義格式上可以發現:Thread類也是Runnable接口的子類。
從類的關係上看,之前的做法非常類似於代理設計模式,Thread類完成比線程主體更多的操作。例如:分配cpu、判斷是否已經啟動等等。

6、Thread類與Runnable接口的區別

使用Thread類在操作多線程的時候,無法達到資源共享的母的。而使用Runnable接口實現的多線程可以實現資源共享。
class MyThread extends Thread{	// 繼承Thread類,作為線程的實現類
	private int ticket = 5 ;		// 表示一共有5張票
	public void run(){	// 覆寫run()方法,作為線程 的操作主體
		for(int i=0;i<100;i++){
			if(this.ticket>0){
				System.out.println("賣票:ticket = " + ticket--) ;
			}
		}
	}
};
public class ThreadDemo04{
	public static void main(String args[]){
		MyThread mt1 = new MyThread() ;	 // 實例化對象
		MyThread mt2 = new MyThread() ;	 // 實例化對象
		MyThread mt3 = new MyThread() ;	 // 實例化對象
		mt1.run() ;	// 調用線程主體
		mt2.run() ;	// 調用線程主體
		mt3.run() ;	// 調用線程主體
	}
};
三個線程各自賣各自的5張票,沒有達到資源共享。
class MyThread implements Runnable{	// 繼承Thread類,作為線程的實現類
	private int ticket = 5 ;		// 表示一共有5張票
	public void run(){	// 覆寫run()方法,作為線程 的操作主體
		for(int i=0;i<100;i++){
			if(this.ticket>0){
				System.out.println("賣票:ticket = " + ticket--) ;
			}
		}
	}
};
public class RunnableDemo02{
	public static void main(String args[]){
		MyThread mt = new MyThread() ;	 // 實例化對象
		new Thread(mt).run() ;	// 調用線程主體
		new Thread(mt).run() ;	// 調用線程主體
		new Thread(mt).run() ;	// 調用線程主體
	}
};
雖然啟動了三個線程,三個線程總共賣出了5張票。達到資源共享。

7、Thread類與Runnable接口使用結論


8、線程的狀態




實際上,線程調用start()方法的時候不是立刻啟動的,而是等待cpu進行調度的。

9、總結



最後更新:2017-04-03 14:53:40

  上一篇:go SystemVerilog語言簡介(一)
  下一篇:go HDU 2050 分割問題