更新時(shí)間:2022-12-19 11:57:29 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1317次
動(dòng)力節(jié)點(diǎn)小編來(lái)告訴大家Java實(shí)現(xiàn)多線程的三種方式,供大家參考,具體內(nèi)容如下
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) {
//方法一:繼承Thread
int i = 0;
// for(; i < 100; i++){
// System.out.println(Thread.currentThread().getName() + " " + i);
// if (i == 5) {
// ThreadExtendsThread threadExtendsThread = new ThreadExtendsThread();
// threadExtendsThread.start();
// }
// }
//方法二:實(shí)現(xiàn)Runnable
// for(i = 0; i < 100; i++){
// System.out.println(Thread.currentThread().getName() + " " + i);
// if (i == 5) {
// Runnable runnable = new ThreadImplementsRunnable();
// new Thread(runnable).start();
// new Thread(runnable).start();
// }
// }
//方法三:實(shí)現(xiàn)Callable接口
Callable<Integer> callable = new ThreadImplementsCallable();
FutureTask<Integer> futureTask = new FutureTask<>(callable);
for(i = 0; i < 100; i++){
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 5) {
new Thread(futureTask).start();
new Thread(futureTask).start();
}
}
try {
System.out.println("futureTask ruturn: " + futureTask.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}
方法一,繼承自Thread
public class ThreadExtendsThread extends Thread {
private int i;
@Override
public void run() {
for(; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
}
run方法為線程執(zhí)行體,ThreadExtendsThread對(duì)象即為線程對(duì)象。
方法二,實(shí)現(xiàn)Runnable接口
public class ThreadImplementsRunnable implements Runnable {
private int i;
@Override
public void run() {
for(; i < 100; i++){
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
run方法為線程執(zhí)行體,使用時(shí)New一個(gè)Thread對(duì)象,Runnable對(duì)象作為target傳遞給Thread對(duì)象。且同一個(gè)Runnable對(duì)象可作為多個(gè)Thread的target,這些線程均共享Runnable對(duì)象的實(shí)例變量。
方法三,實(shí)現(xiàn)Callable接口
import java.util.concurrent.Callable;
public class ThreadImplementsCallable implements Callable<Integer> {
private int i;
@Override
public Integer call() throws Exception {
for(; i < 100; i++){
System.out.println(Thread.currentThread().getName() + " " + i);
}
return i;
}
}
Callable接口類似于Runnable接口,但比對(duì)方強(qiáng)大,線程執(zhí)行體為call方法,該方法具有返回值和可拋出異常。使用時(shí)將Callable對(duì)象包裝為FutureTask對(duì)象,通過泛型指定返回值類型。可稍候調(diào)用FutureTask的get方法取回執(zhí)行結(jié)果。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)