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