java基礎——多線程的兩種實現方式

第一種實現方式:繼承Thread類,並實現run方法,這種狀況下每一個線程對象都有一個獨立的run方法多線程

package thread; /* @author zsben @create 2020-01-03 9:52 多線程建立的第一種方法:繼承於Thread類 1.建立一個繼承於Thread的類 2.重寫Thread類的run方法-->將此線程執行的操做聲明在run中 3.建立Thread子類對象 4.經過此對象調用start方法:啓動當前線程,調用當前線程的run方法 */

//1.建立一個繼承Thread類的子類
class MyThread extends Thread{ //2.重寫run
 @Override public void run() { for(int i=0;i<100;i++){ if(i%2==0) System.out.println(Thread.currentThread().getName()+" "+i); } } } public class ThreadTest { public static void main(String[] args) { //3.建立MyThread對象
        MyThread myThread = new MyThread(); //4.調用start方法
 myThread.start(); //myThread.run();若是隻調用run方法,則只執行run裏的代碼,不新建新線程 //myThread.start();一個已經在run的線程沒法再次start
 MyThread myThread1 = new MyThread(); myThread1.start(); for(int i=0;i<100;i++){ if(i%2!=0) System.out.println(Thread.currentThread().getName()+" "+i); } //建立Thread類的匿名子類方式
        new Thread(){ @Override public void run() { for(int i=0;i<100;i++){ if(i%2==0) System.out.println(Thread.currentThread().getName()+" "+i); } } }.start(); new Thread(){ @Override public void run() { for(int i=0;i<100;i++){ if(i%2==1) System.out.println(Thread.currentThread().getName()+" "+i); } } }.start(); } }

第二種實現方法:實現Runnable接口,並經過實現類做爲參數new Thread對象ide

package thread; /* 建立多線程的方式二:實現Runnable接口 1.建立一個實現了Runnable接口的類 2.實現類去實現Runnable中的抽象方法:run() 3.建立實現類的對象 4.將此對象做爲參數傳遞到Thread類的構造器中,建立Thread類的對象 5.經過Thread類的對象調用start() Thread源碼裏,有一個Runnable對象target, 當調用Thread(Runnable o)時,target就被賦值爲o 此時調用run方法時,就會調用target(即o)的run方法 若是target==null,那麼調用run方法時,調用的就是Thread本身的run方法,就是繼承Thread類的狀況了
比較兩種線程建立方式: 開發中優先選擇實現Runnable接口方式 1.實現的方式沒有類的單繼承侷限性 2.實現的方式更適合處理多線程有共享數據狀況 線程生命週期: sleep(time),join() sleep()時間到,join()結束 |--->--------阻塞------<---| 等待同步鎖,wait() 得到同步鎖,notify() | | suspend()已被廢棄 resume()已被廢棄 | 獲取cpu執行權 | 新建----------------->就緒<---------------------->運行------------------->死亡 start() 失去cpu執行權或yield() run()執行完,stop(), 出現Error或異常且沒處理 @author zsben @create 2020-01-03 13:16
*/ //1.建立一個實現了Runnable接口的類 class MyRunnable implements Runnable{ //2.實現類去實現Runnable中的抽象方法:run() @Override public void run() { for(int i=0;i<100;i++) if(i%2==0) System.out.println(Thread.currentThread().getName()+":"+i); } } public class RunnableTest { public static void main(String[] args) { //3.建立實現類的對象 MyRunnable myRunnable = new MyRunnable(); //4.將此對象做爲參數傳遞到Thread類的構造器中,建立Thread類的對象 Thread t1 = new Thread(myRunnable); //5.經過Thread類的對象調用start() t1.start(); //再啓動一個線程,run方法仍是那個myRunnable對象裏的run方法 Thread t2 = new Thread(myRunnable); t2.start(); } }
相關文章
相關標籤/搜索