Java建立執行緒的幾種方式
阿新 • • 發佈:2021-01-24
第一種:繼承Thread
首先繼承Thread方法,重寫Thread的run()方法
在main()方法裡建立一個MyThread物件,呼叫該物件的start()方法,start()方法會通過對系統底層的一系列操作,創建出一個相應的執行緒,與當前執行緒併發執行。如果直接呼叫run()方法,程式將執行完run()方法後才會執行main()方法中後面的程式碼,這樣就是單執行緒執行而不是多執行緒併發執行了。
public class MyThread extends Thread {
@Override
public void run() {
doSomething();
}
private void doSomething(){
System.out.println("Just do it!");
}
}
public class Main{
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
第二種:實現Runnable介面
使用Runnable介面與繼承Thread類的用法相似
不同的是,實現Runnable介面的類中沒有start()方法,所以要用Thread構造個方法開啟執行緒
public class RunnableThread implements Runnable {
@Override
public void run() {
doSomething();
}
private void doSomething(){
System.out.println("Just do it!");
}
}
public class Main{
public static void main(String[] args) {
RunnableThread runnableThread = new RunnableThread();
Thread thread = new Thread(runnableThread);
thread.start();
}
}
第三種:是實現Callable介面和Future建立執行緒
首先建立Callable介面的實現類CallableThread,實現call()方法,並且有返回值。Callable介面是一個帶泛型的介面,泛型的型別就是執行緒返回值的型別。實現Callable介面中的call()方法,方法的返回型別與泛型的型別相同。
Callable不能直接獲取返回值,需要用FutureTask在外部封裝一下再獲取返回值
public class CallableThread implements Callable<String> {
@Override
public String call() throws Exception {
doSomething();
return "over";
}
private void doSomething(){
System.out.println("Just do it!");
}
}
public class Main {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable<String> callable = new CallableThread();//callable不能直接獲取返回值
FutureTask<String> futureTask = new FutureTask<String>(callable);//需要futureTask封裝一下,獲取返回值
Thread thread = new Thread(futureTask);
thread.start();
doSomething();
System.out.println(futureTask.get());
}
private static void doSomething() {
System.out.println("main");
}
}