java启动100线程_Java启动新线程的几种方式(Runnable、Callable、CompletableFuture)
一、實(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java制作安卓客户端_制作网页的And
- 下一篇: java的annotation_Java