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更強大的功能:
- 在任務結束後可以有個返回值
- Call()方法可以拋出異常
- 可以拿到一個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方法