Java中建立多執行緒的三種方式
阿新 • • 發佈:2021-02-12
目錄
一、繼承Thread類
繼承Thread類是Java中比較常見,也是很基礎的一種實現Java多執行緒的方式。實現的方式也比較簡單,只要將需要實現多執行緒的Java類繼承java.lang.Thread類即可。
class MyThread extends Thread{
private String name;
public MyThread(String name){
this.name = name;
}
@Override
public void run() {
Thread.currentThread().setName(name);
System.out.println("I am Thread :" + name);
}
}
如上程式碼片段則是通過繼承Thread類實現多執行緒的方式之一。那麼多執行緒該如何呼叫呢?請接著閱讀下邊的程式碼。
public class startThread {
public static void main(String[] args) {
//例項化繼承了Thread的類
MyThread thread1 = new MyThread("Thread1");
//通過從Thread類中所繼承的start()方法啟動執行緒;
thread1.start();
}
}
執行上邊的程式碼,可以得到結果:
到這裡,一個簡單的執行緒已經被啟動了。下邊我們接著介紹另外兩種多執行緒的實現方式。
二、實現Runnable介面
接下來請看這樣一種場景,DogRobot是一個用來看門的Dog,現在需要多個Dog分別把守不同的位置,但DogRobot一定要繼承Robot父類,此時應該如何實現多執行緒呢?
在這種場景下,可以通過實現Runable介面的方式來實現一個類的多執行緒。
我們知道,在Java中,類的繼承是單一的,即一個子類僅可以繼承一個父類(一個兒子只有一個爹,符合自然規律),但可以實現多個介面。那麼,通過Runable介面來實現多執行緒的好處自然不言而喻。
接下來看一下實現方式:
public class threadLearn {
public static void main(String[] args) {
//例項化繼承了Thread的類
MyThread thread1 = new MyThread("Thread1");
//通過從Thread類中所繼承的start()方法啟動執行緒;
thread1.start();
/*
* 實現Runnable的類,需要將其放在一個Thread例項物件中,
* 由Thread例項物件進行執行緒的啟動及控制。
*/
Thread threadDog = new Thread(new DogRobot("kiki"));
threadDog.start();
}
}
class DogRobot extends Robot implements Runnable{
private String name;
public DogRobot(String name){
super(name);
this.name = name;
}
@Override
public void run() {
Thread.currentThread().setName(name);
System.out.println("I am DogRobot :" +name);
}
}
class Robot {
private String Name;
public Robot(String name){
this.Name = name;
}
}
輸出結果如下:
下邊接著講解第三種多執行緒的實現方式。
三、實現Callable介面
程式碼如下(示例):
/*
* Callable介面實現多執行緒Demo
*/
class MyCallable<V> implements Callable<V>
{
@Override
public V call() throws Exception {
// TODO Auto-generated method stub
System.out.println("I am Callable thread : "+Thread.currentThread().getName());
return null;
}
}
如何呼叫這個執行緒,使其執行任務呢?是需要通過FutureTask這個類的例項去排程,程式碼如下
public static void main(String[] args) {
/*
* 使用Callable來建立執行緒
*/
Callable <Integer> aCallable = new MyCallable<Integer>();
FutureTask<Integer> aTask = new FutureTask<Integer>(aCallable);
Thread aThread = new Thread(aTask);
aThread.start();
}
我們執行一下程式,可以看到,執行的結果如下圖所示:
到這裡,一個通過Callable實現的介面便是成功了。