Java創(chuàng)建線(xiàn)程的三種方式

介紹

Java創(chuàng)建線(xiàn)程的三種方式:

  1. 直接繼承Thread
  2. 通過(guò)Runnable實(shí)現(xiàn)
  3. 通過(guò)FutureTask和Callable實(shí)現(xiàn)

一、直接繼承Thread

方法

定義一個(gè)類(lèi)(比如:FirstThreadTest)繼承于 Thread 類(lèi)。

public class FirstThreadTest extends Thread {

    @Override
    public void run() {
        System.out.println("執(zhí)行 " + getName() + " 線(xiàn)程");
    }
}

使用

FirstThreadTest thread1 = new FirstThreadTest();
thread1.run();

FirstThreadTest thread2 = new FirstThreadTest();
thread2.run();

輸出

執(zhí)行 Thread-0 線(xiàn)程
執(zhí)行 Thread-1 線(xiàn)程

二、通過(guò)Runnable實(shí)現(xiàn)

方法

定義一個(gè)類(lèi)(比如:RunnableThreadTest),實(shí)現(xiàn) Runnable 接口。

public class RunnableThreadTest implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 10; ++i) {
            System.out.println("執(zhí)行 " + Thread.currentThread().getName() + ", i = " + i);
        }
    }
}

使用

RunnableThreadTest runnableThreadTest = new RunnableThreadTest();
new Thread(runnableThreadTest, "新線(xiàn)程1").start();
new Thread(runnableThreadTest, "新線(xiàn)程2").start();

輸出

執(zhí)行 新線(xiàn)程1, i = 0
執(zhí)行 新線(xiàn)程2, i = 0
執(zhí)行 新線(xiàn)程2, i = 1
執(zhí)行 新線(xiàn)程2, i = 2
執(zhí)行 新線(xiàn)程2, i = 3
執(zhí)行 新線(xiàn)程2, i = 4
執(zhí)行 新線(xiàn)程1, i = 1
執(zhí)行 新線(xiàn)程2, i = 5
執(zhí)行 新線(xiàn)程1, i = 2
執(zhí)行 新線(xiàn)程2, i = 6
執(zhí)行 新線(xiàn)程1, i = 3
執(zhí)行 新線(xiàn)程2, i = 7
執(zhí)行 新線(xiàn)程1, i = 4
執(zhí)行 新線(xiàn)程1, i = 5
執(zhí)行 新線(xiàn)程2, i = 8
執(zhí)行 新線(xiàn)程1, i = 6
執(zhí)行 新線(xiàn)程1, i = 7
執(zhí)行 新線(xiàn)程2, i = 9
執(zhí)行 新線(xiàn)程1, i = 8
執(zhí)行 新線(xiàn)程1, i = 9

(備注:因?yàn)槭嵌嗑€(xiàn)程,輸出的結(jié)果可能不一定完全一致。)

三、通過(guò)FutureTask和Callable實(shí)現(xiàn)

方法

定義一個(gè)類(lèi)(比如:CallableThreadTest)實(shí)現(xiàn) Callable 接口。
另外,call 方法具有返回值,執(zhí)行結(jié)束后可將結(jié)果返回給調(diào)用方。

public class CallableThreadTest implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        int i = 0;
        for(;i < 10; ++i) {
            System.out.println("執(zhí)行 " + Thread.currentThread().getName() + ",i = " + i);
        }

        return i;
    }

}

使用

CallableThreadTest callableThreadTest = new CallableThreadTest();
FutureTask<Integer> futureTask = new FutureTask<>(callableThreadTest);

new Thread(futureTask, "有返回值的線(xiàn)程").start();

try {
    System.out.println("子線(xiàn)程的返回值:" + futureTask.get());
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}

輸出

執(zhí)行 有返回值的線(xiàn)程,i = 0
執(zhí)行 有返回值的線(xiàn)程,i = 1
執(zhí)行 有返回值的線(xiàn)程,i = 2
執(zhí)行 有返回值的線(xiàn)程,i = 3
執(zhí)行 有返回值的線(xiàn)程,i = 4
執(zhí)行 有返回值的線(xiàn)程,i = 5
執(zhí)行 有返回值的線(xiàn)程,i = 6
執(zhí)行 有返回值的線(xiàn)程,i = 7
執(zhí)行 有返回值的線(xiàn)程,i = 8
執(zhí)行 有返回值的線(xiàn)程,i = 9
子線(xiàn)程的返回值:10
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容