日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java启动100线程_Java启动新线程的几种方式(Runnable、Callable、CompletableFuture)

發(fā)布時(shí)間:2025/3/15 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java启动100线程_Java启动新线程的几种方式(Runnable、Callable、CompletableFuture) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、實(shí)現(xiàn)Runnable接口

public classRunnableDemo implements Runnable {public voidrun() {try{

Thread.sleep(100);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println("in runnable demo");

}

}

非阻塞調(diào)用

public static void main(String[] args) throwsException {

Thread runnableThread= new Thread(newRunnableDemo());runnableThread.start();

System.out.println("in main");

}

輸出結(jié)果

in main

in runnable demo

可以看到線程的運(yùn)行沒有阻塞當(dāng)前線程

阻塞調(diào)用

public static void main(String[] args) throwsException {

Thread runnableThread= new Thread(newRunnableDemo());

runnableThread.start();

runnableThread.join();

System.out.println("in main");

}

輸出結(jié)果

in runnable demo

in main

Join會(huì)阻塞當(dāng)前線程,一直等待自定義線程才返回。

二、實(shí)現(xiàn)Callable接口

在Runnable的例子中,Runnable接口有一個(gè)很大的缺陷就是run方法沒有返回值定義,主線程無法獲取到線程執(zhí)行的結(jié)果。這個(gè)時(shí)候就需要Callable接口。

public class CallableDemo implements Callable{public CallableDtocall() throwsException {try{

Thread.sleep(100);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println("in callable demo");return new CallableDto(1);

}

}classCallableDto {private intid;public CallableDto(intid) {this.id =id;

}public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}

}

非阻塞調(diào)用

public static void main(String[] args) throwsException {

ThreadPoolExecutor executor= (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

Future future = executor.submit(newCallableDemo());

System.out.println("in main");

}

輸出結(jié)果,如下所示,新啟動(dòng)的線程沒有阻塞當(dāng)前線程

in main

in callable demo

阻塞調(diào)用,且拿到結(jié)果

public static void main(String[] args) throwsException {

ThreadPoolExecutor executor= (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

Future future = executor.submit(newCallableDemo());

CallableDto callableDto=future.get();

System.out.println("in main");

System.out.println("id from callable is " +callableDto.getId());

}

get方法首先會(huì)阻塞主線程,等待當(dāng)前線程執(zhí)行結(jié)束才返回,且返回線程的執(zhí)行結(jié)果。

三、CompletableFuture方式

CompletableFuture是jdk1.8引入的api,做了進(jìn)一步的封裝,用戶線程無需實(shí)現(xiàn)Callable接口也能啟動(dòng),且能夠返回用戶線程的執(zhí)行結(jié)果

public static CompletableFuture supplyAsync(Supplier supplier, Executor executor)

一個(gè)沒有實(shí)現(xiàn)Callable的普通方法

public classCompletableFutureDemo {publicCompletableFutureDemoDto action() {try{

Thread.sleep(100);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println("in CompletableFutureDemo ");return new CompletableFutureDemoDto(1);

}

}classCompletableFutureDemoDto {private intid;public CompletableFutureDemoDto(intid) {this.id =id;

}public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}

}

非阻塞調(diào)用

public static void main(String[] args) throwsException {

ThreadPoolExecutor executor= (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

CompletableFuture future = CompletableFuture.supplyAsync(() ->{return newCompletableFutureDemo().action();

}, executor);

System.out.println("in main");

}

執(zhí)行結(jié)果,可以看到,主線程沒有被阻塞

in main

in CompletableFutureDemo

阻塞調(diào)用且獲取結(jié)果

public static void main(String[] args) throwsException {

ThreadPoolExecutor executor= (ThreadPoolExecutor) Executors.newFixedThreadPool(10);

CompletableFuture future = CompletableFuture.supplyAsync(() ->{return newCompletableFutureDemo().action();

}, executor);

CompletableFutureDemoDto demoDto=future.join();

System.out.println("in main");

System.out.println("id from demoDto is " +demoDto.getId());

}

執(zhí)行結(jié)果,主線程一直被阻塞,一直等到用戶線程返回

in CompletableFutureDemo

in main

id from demoDto is1

總結(jié)

以上是生活随笔為你收集整理的java启动100线程_Java启动新线程的几种方式(Runnable、Callable、CompletableFuture)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。