JAVA線程2 線程的創建

1 如何實現Java多線程?

1.1.繼承Thread類,重寫run()方法

Thread類本質上是實現了Runnable接口的一個實例。


Class MyThread extends Thread{

    public void run()
    {
        System.out.println(“Thread body”);
    }
}

public class Test{
    public static void main(String[] args){
        MyThread thread=new MyThread ();
        thread.start();//開啓線程
    }
}

1.2.實現Runnable接口,並實現該接口的run()方法

Class MyThread implements Runnable{
    public void run()
    {
        System.out.println(“Thread body”);
    }
}

public class Test{
    public static void main(String[] args){
        MyThread thread=new MyThread ();
        Thread t=new Thread(thread);
        t.start();//開啓線程
    }
}

啓動線程:start()-啓動一個新線程,並執行線程中的run方法。但是調用後並不是立即執行多線程代碼,而是讓該線程變爲可運行態(Runnable),什麼時候運行代碼由操作系統決定。

 

1.3.實現Callable接口,重寫call()方法 

最終還是通過Thread的對象的API來控制線程。

該接口和Runnable接口的功能類似,但提供了比Runnable更強大的功能:

  1. 在任務結束後可以有個返回值
  2. Call()方法可以拋出異常
  3. 可以拿到一個Future對象,檢查進程是否完成,使用該對象的get方法獲取線程結束的返回值。
Class MyThread implements Callable<String>{
    public String call() throws Exception
    {
        return “Hello world!”;
    }
}

public class Test{
    public static void main(String[] args){
        ExecutorService threadPool=Executors.newSingleThreadExecutor();
        Future<String> future=threadPool.submit(new MyThread ());//啓動
        System.out.println(future.get());

    }
}

以上三種方式中,前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。當需要實現多線程時,推薦使用實現Runnable接口的方式。

2.Thread和Runnable的關係

Thread是實現了Runnable接口的類,使用run支持多線程

因類的單一繼承原則,推薦多使用Runnable接口

3 run方法和start方法的區別?

系統通過線程類的start()方法來啓動一個線程,此時該線程處於就緒狀態,意味着這個線程可以被JVM來調度執行。在調度過程中,JVM通過調用線程類的run()方法來完成實際的操作,當run()方法結束後,此線程就會終止。

直接調用線程的run()方法,就是一個普通的函數,程序還是隻有一個線程。

start()方法能夠異步地調用run()方法,只有通過調用線程類的start方法才能真正達到多線程的目的。

start方法會去調用JVM的StartThread方法去創建一個子線程,並去調用run方法

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