java實現線程的方式
❶ java多線程方法有哪些
java實現線程常用到的方法有三種,供參考:
/**
*方法一:繼承Thread類
*
*@authorqd
*
*/
{
@Override
publicvoidrun(){
System.out.println("run方法裡面編寫業務代碼");
}
publicstaticvoidmain(String[]args){
MyThreadmyThread=newMyThread();
//調用start方法啟動線程
myThread.start();
MyThread1myThread1=newMyThread1();
Threadthread=newThread(myThread1);
//調用start方法啟動線程
thread.start();
}
}
/**
*方法二:實現Runnable介面
*
*@authorqd
*
*/
{
@Override
publicvoidrun(){
System.out.println("run方法裡面編寫業務代碼");
}
}
/**
*方法三:實現Callable<T>介面優點:可以傳參數,有返回值類型
*
*@authorqd
*
*/
<Integer>{
@Override
publicIntegercall()throwsException{
returnnull;
}
}
❷ 在Java 中多線程的實現方法有哪些,如何使用
1、 認識Thread和Runnable
Java中實現多線程有兩種途徑:繼承Thread類或者實現Runnable介面。Runnable是介面,建議用介面的方式生成線程,因為介面可以實現多繼承,況且Runnable只有一個run方法,很適合繼承。在使用Thread的時候只需繼承Thread,並且new一個實例出來,調用start()方法即可以啟動一個線程。
Thread Test = new Thread();
Test.start();
在使用Runnable的時候需要先new一個實現Runnable的實例,之後啟動Thread即可。
Test impelements Runnable;
Test t = new Test();
Thread test = new Thread(t);
test.start();
總結:Thread和Runnable是實現java多線程的2種方式,runable是介面,thread是類,建議使用runable實現java多線程,不管如何,最終都需要通過thread.start()來使線程處於可運行狀態。
2、 認識Thread的start和run
1) start:
用start方法來啟動線程,真正實現了多線程運行,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。通過調用Thread類的start()方法來啟動一個線程,這時此線程處於就緒(可運行)狀態,並沒有運行,一旦得到spu時間片,就開始執行run()方法,這里方法run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程隨即終止。
2) run:
run()方法只是類的一個普通方法而已,如果直接調用Run方法,程序中依然只有主線程這一個線程,其程序執行路徑還是只有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。
總結:調用start方法方可啟動線程,而run方法只是thread的一個普通方法調用,還是在主線程里執行。
3、 線程狀態說明
線程狀態從大的方面來說,可歸結為:初始狀態、可運行狀態、不可運行狀態和消亡狀態,具體可細分為上圖所示7個狀態,說明如下:
1) 線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable介面,但不管怎樣,當我們new了thread實例後,線程就進入了初始狀態;
2) 當該對象調用了start()方法,就進入可運行狀態;
3) 進入可運行狀態後,當該對象被操作系統選中,獲得CPU時間片就會進入運行狀態;
4) 進入運行狀態後case就比較多,大致有如下情形:
·run()方法或main()方法結束後,線程就進入終止狀態;
·當線程調用了自身的sleep()方法或其他線程的join()方法,就會進入阻塞狀態(該狀態既停止當前線程,但並不釋放所佔有的資源)。當sleep()結束或join()結束後,該線程進入可運行狀態,繼續等待OS分配時間片;
·當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被鎖牢(synchroniza,lock),將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池裡也許已經有了其他線程在等待獲取鎖標記,這時它們處於隊列狀態,既先到先得),一旦線程獲得鎖標記後,就轉入可運行狀態,等待OS分配CPU時間片;
·當線程調用wait()方法後會進入等待隊列(進入這個狀態會釋放所佔有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒(由於notify()只是喚醒一個線程,但我們由不能確定具體喚醒的是哪一個線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒後會進入鎖池,等待獲取鎖標記。
·當線程調用stop方法,即可使線程進入消亡狀態,但是由於stop方法是不安全的,不鼓勵使用,大家可以通過run方法里的條件變通實現線程的stop。
❸ java多線程有幾種實現方法,都是什麼同步有幾種實現方法,都是什麼
java中多線程的實現方法有兩種:1.直接繼承thread類;2.實現runnable介面;同步的實現方法有五種:1.同步方法;2.同步代碼塊;3.使用特殊域變數(volatile)實現線程同步;4.使用重入鎖實現線程同步;5.使用局部變數實現線程同步
。
其中多線程實現過程中需注意重寫或者覆蓋run()方法,而對於同步的實現方法中使用較常使用的是利用synchronized編寫同步方法和代碼塊。
❹ JAVA多線程有哪幾種實現方式
JAVA多線程實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。
1、繼承Thread類實現多線程
繼承Thread類的方法盡管被我列為一種多線程實現方式,但Thread本質上也是實現了Runnable介面的一個實例,它代表一個線程的實例,並且,啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,並執行run()方法。這種方式實現多線程很簡單,通過自己的類直接extend Thread,並復寫run()方法,就可以啟動新線程並執行自己定義的run()方法。例如:
[java]view plain
{
publicvoidrun(){
System.out.println("MyThread.run()");
}
}
- 在合適的地方啟動線程如下:
MyThreadmyThread1=newMyThread();
MyThreadmyThread2=newMyThread();
myThread1.start();
myThread2.start();
- 2、實現Runnable介面方式實現多線程
- 如果自己的類已經extends另一個類,就無法直接extends Thread,此時,必須實現一個Runnable介面,如下:
{
publicvoidrun(){
System.out.println("MyThread.run()");
}
}
- 為了啟動MyThread,需要首先實例化一個Thread,並傳入自己的MyThread實例:
MyThreadmyThread=newMyThread();
Threadthread=newThread(myThread);
thread.start();
- 事實上,當傳入一個Runnable target參數給Thread後,Thread的run()方法就會調用target.run(),參考JDK源代碼:
publicvoidrun(){
if(target!=null){
target.run();
}
}
- 3、使用ExecutorService、Callable、Future實現有返回結果的多線程
- ExecutorService、Callable、Future這個對象實際上都是屬於Executor框架中的功能類。想要詳細了解Executor框架的可以訪問http://www.javaeye.com/topic/366591 ,這裡面對該框架做了很詳細的解釋。返回結果的線程是在JDK1.5中引入的新特徵,確實很實用,有了這種特徵我就不需要再為了得到返回值而大費周折了,而且即便實現了也可能漏洞百出。
- 可返回值的任務必須實現Callable介面,類似的,無返回值的任務必須Runnable介面。執行Callable任務後,可以獲取一個Future的對象,在該對象上調用get就可以獲取到Callable任務返回的Object了,再結合線程池介面ExecutorService就可以實現傳說中有返回結果的多線程了。下面提供了一個完整的有返回結果的多線程測試例子,在JDK1.5下驗證過沒問題可以直接使用。
[java]view plain
[java]view plain
[java]view plain
[java]view plain
❺ java有幾種實現線程的方式
有三種:
(1)繼承Thread類,重寫run函數
創建:class xx extends Thread{ public void run(){Thread.sleep(1000) //線程休眠1000毫秒,sleep使線程進入Block狀態,並釋放資源}}
開啟線程:對象.start() //啟動線程,run函數運行
(2)實現Runnable介面,重寫run函數
開啟線程:Thread t = new Thread(對象) //創建線程對象t.start()
(3)實現Callable介面,重寫call函數
Callable是類似於Runnable的介面,實現Callable介面的類和實現Runnable的類都是可被其它線程執行的任務。
❻ 如何在Java中實現線程
java中多線程的實現方式有兩種,一種是繼承java.lang.Thread類,另一種是實現java.lang.Runnable介面。下面是兩種方式的簡單代碼。繼承Thread類方式:import java.lang.Thread; //用集成Thread類方式實現多線程。 public class Test{ public static void main(String arg[]){ T t1=new T(); T t2=new T(); //更改新線程名稱 t1.setName("t1"); t2.setName("t2"); //啟動線程 t1.start(); t2.start(); } } class T extends Thread{ //重寫run()方法 public void run(){ System.out.println(this.getName()); } }輸出結果為:t1t2實現Runnable介面方式:在使用Runnable介面時需要建立一個Thread實例。因此,無論是通過Thread類還是Runnable介面建立線程,都必須建立Thread類或它的子類的實例。import java.lang.*; //用實現Runnable介面的方式實現多線程。 public class Test{ public static void main(String arg[]){ T t1=new T(); T t2=new T(); //一定要實例化Thread對象,將實現Runnable介面的對象作為參數傳入。 Thread th1=new Thread(t1,"t1"); Thread th2=new Thread(t2,"t2"); //啟動線程 th1.start(); th2.start(); } } class T implements Runnable{ //重寫run()方法 public void run(){ System.out.println(Thread.currentThread().getName()); } }輸出結果為:t1t2public void run()方法是JAVA中線程的執行體方法,所有線程的操作都是從run方法開始,有點類似於main()方法,即主線程。
❼ java創建線程有幾種方式
java創建線程的方式有三種
第一種是繼承Thread類 實現方法run() 不可以拋異常 無返回值
第二種是實現Runnable介面 實現方法run() 不可以拋異常 無返回值
第三種是實現Callable<T>介面,介面中要覆蓋的方法是 public <T> call() 注意:此方法可以拋異常,而前兩種不能 而且此方法可以有返回值
第三種如何運行呢 Callable介面在util.concurrent包中,由線程池提交
import java.util.concurrent.*;
ExecutorService e = Executors.newFixedThreadPool(10); 參數表示最多可以運行幾個線程
e.submit(); 這個裡面參數傳 實現Callable介面那個類的對象
❽ java有幾種實現線程的方式
有三種:
(1)繼承Thread類,重寫run函數
創建:class xx extends Thread{ public void run(){Thread.sleep(1000) //線程休眠1000毫秒,sleep使線程進入Block狀態,並釋放資源}}
開啟線程:對象.start() //啟動線程,run函數運行
(2)實現Runnable介面,重寫run函數
開啟線程:Thread t = new Thread(對象) //創建線程對象t.start()
(3)實現Callable介面,重寫call函數
Callable是類似於Runnable的介面,實現Callable介面的類和實現Runnable的類都是可被其它線程執行的任務。
❾ java創建線程的幾種方式,了解一下
第一種方式:使用Runnable介面創建線程
第二種方式:直接繼承Thread類創建對象
使用Runnable介面創建線程
1.可以將CPU,代碼和數據分開,形成清晰的模型
2.線程體run()方法所在的類可以從其它類中繼承一些有用的屬性和方法
3.有利於保持程序的設計風格一致
直接繼承Thread類創建對象
1.Thread子類無法再從其它類繼承(java語言單繼承)。
2.編寫簡單,run()方法的當前對象就是線程對象,可直接操作。
在實際應用中,幾乎都採取第一種方式