Java中的多線程有三種實現方式:
1.繼承Thread類,重寫run方法。Thread本質上也是一個實現了Runnable的實例,他代表一個線程的實例,並且啓動線程的唯一方法就是通過Thread類的start方法。
2.實現Runnable接口,並實現該接口的run()方法.創建一個Thread對象,用實現的Runnable接口的對象作爲參數實例化Thread對象,調用此對象的start方法。
3.實現Callable接口,重寫call方法。Callable接口與Runnable接口的功能類似,但提供了比Runnable更強大的功能。有以下三點
1).Callable可以在人物結束後提供一個返回值,Runnable沒有提供這個功能。
2).Callable中的call方法可以拋出異常,而Runnable的run方法不能拋出異常。
3).運行Callable可以拿到一個Future對象,表示異步計算的結果,提供了檢查計算是否完成的方法。
1、繼承 Thread 類
class MyThread extends Thread{
public void run() {
System.out.println("My thread is started.");
}
}
實現該繼承類的 run 方法,然後就可以創建這個子類的對象,調用 start 方法即可創建一個新的線程:
MyThread myThread = new MyThread();
myThread.start();
2、實現 Runnable 接口
class MyRunnable implements Runnable{
public void run() {
System.out.println("My runnable is invoked.");
}
}
實現 Runnable 接口的類的對象可以作爲一個參數傳遞到創建的 Thread 對象中,同樣調用 Thread#start 方法就可以在一個新的線程中運行 run 方法中的代碼了。
Thread myThread = new Thread( new MyRunnable());
myThread.start();
可以看到,不管是用哪種方法,實際上都是要實現一個 run 方法的。 該方法本質是上一個回調方法。由 start 方法新創建的線程會調用這個方法從而執行需要的代碼。 從後面可以看到,run 方法並不是真正的線程函數,只是被線程函數調用的一個 Java 方法而已,和其他的 Java 方法沒有什麼本質的不同。
run start的區別
start方法是啓動一個線程,而線程中的run方法來完成實際的操作。
如果開發人員直接調用run方法,那麼就會將這個方法當作一個普通函數來調用,並沒有多開闢線程,開發人員如果希望多線程異步執行,則需要調用start方法。
start() 創建新進程
run() 沒有
本文參考:
https://www.cnblogs.com/yfsmooth/p/4652206.html
http://blog.csdn.net/itmyhome1990/article/details/78471653