java高并发系列 - 第31天:获取线程执行结果,这6种方法你都知道?

Thread thread = new Thread(() -> {

try {

TimeUnit.SECONDS.sleep(3);

result.setResult(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

});

thread.start();

//让主线程等待thread线程执行完毕之后再继续,join方法会让当前线程阻塞

thread.join();

//获取thread线程的执行结果

Integer rs = result.getResult();

System.out.println(System.currentTimeMillis());

System.out.println(System.currentTimeMillis() + “:” + rs);

}

}

输出:

1566733162636

1566733165692

1566733165692:10

代码中通过join方式阻塞了当前主线程,当thread线程执行完毕之后,join方法才会继续执行。

join的方式,只能阻塞一个线程,如果其他线程中也需要获取thread线程的执行结果,join方法无能为力了。

关于join()方法和线程更详细的使用,可以参考:线程的基本操作

方式2:CountDownLatch实现


代码:

package com.itsoku.chat31;

import java.util.concurrent.*;

/**

* 跟着阿里p7学并发,微信公众号:javacode2018

*/

public class Demo2 {

//用于封装结果

static class Result<T> {

T result;

public T getResult() {

return result;

}

public void setResult(T result) {

this.result = result;

}

}

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println(System.currentTimeMillis());

CountDownLatch countDownLatch = new CountDownLatch(1);

//用于存放子线程执行的结果

Demo1.Result<Integer> result = new Demo1.Result<>();

//创建一个子线程

Thread thread = new Thread(() -> {

try {

TimeUnit.SECONDS.sleep(3);

result.setResult(10);

} catch (InterruptedException e) {

e.printStackTrace();

}finally {

countDownLatch.countDown();

}

});

thread.start();

//countDownLatch.await()会让当前线程阻塞,当countDownLatch中的计数器变为0的时候,await方法会返回

countDownLatch.await();

//获取thread线程的执行结果

Integer rs = result.getResult();

System.out.println(System.currentTimeMillis());

System.out.println(System.currentTimeMillis() + “:” + rs);

}

}

输出:

1566733720406

1566733723453

1566733723453:10

上面代码也达到了预期效果,使用CountDownLatch可以让一个或者多个线程等待一批线程完成之后,自己再继续;CountDownLatch更详细的介绍见:JUC中等待多线程完成的工具类CountDownLatch,必备技能

方式3:ExecutorService.submit方法实现


代码:

package com.itsoku.chat31;

import java.util.concurrent.*;

/**

* 跟着阿里p7学并发,微信公众号:javacode2018

*/

public class Demo3 {

public static void main(String[] args) throws ExecutionException, InterruptedException {

//创建一个线程池

ExecutorService executorService = Executors.newCachedThreadPool();

System.out.println(System.currentTimeMillis());

Future<Integer> future = executorService.submit(() -> {

try {

TimeUnit.SECONDS.sleep(3);

} catch (InterruptedException e) {

e.printStackTrace();

}

return 10;

});

//关闭线程池

executorService.shutdown();

System.out.println(System.currentTimeMillis());

Integer result = future.get();

System.out.println(System.currentTimeMillis() + “:” + result);

}

}

输出:

1566734119938

1566734119989

1566734122989:10

使用ExecutorService.submit方法实现的,此方法返回一个Futurefuture.get()会让当前线程阻塞,直到Future关联的任务执行完毕。

相关知识:

  1. JAVA线程池,这一篇就够了

  2. JUC中的Executor框架详解1

  3. JUC中的Executor框架详解2

方式4:FutureTask方式1


代码:

package com.itsoku.chat31;

import java.util.concurrent.*;

/**

* 跟着阿里p7学并发,微信公众号:javacode2018

*/

public class Demo4 {

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println(System.currentTimeMillis());

//创建一个FutureTask

FutureTask<Integer> futureTask = new FutureTask<>(() -> {

try {

TimeUnit.SECONDS.sleep(3);

} catch (InterruptedException e) {

e.printStackTrace();

}

return 10;

});

//将futureTask传递一个线程运行

new Thread(futureTask).start();

System.out.println(System.currentTimeMillis());

//futureTask.get()会阻塞当前线程,直到futureTask执行完毕

Integer result = futureTask.get();

System.out.println(System.currentTimeMillis() + “:” + result);

}

}

输出:

1566736350314

1566736350358

1566736353360:10

代码中使用FutureTask实现的,FutureTask实现了Runnable接口,并且内部带返回值,所以可以传递给Thread直接运行,futureTask.get()会阻塞当前线程,直到FutureTask构造方法传递的任务执行完毕,get方法才会返回。关于FutureTask详细使用,请参考:JUC中的Executor框架详解1

方式5:FutureTask方式2


代码:

package com.itsoku.chat31;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.FutureTask;

import java.util.concurrent.TimeUnit;

/**

* 跟着阿里p7学并发,微信公众号:javacode2018

*/

public class Demo5 {

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println(System.currentTimeMillis());

//创建一个FutureTask

FutureTask<Integer> futureTask = new FutureTask<>(() -> 10);

//将futureTask传递一个线程运行

new Thread(() -> {

try {

TimeUnit.SECONDS.sleep(3);

} catch (InterruptedException e) {

e.printStackTrace();

}

futureTask.run();

}).start();

System.out.println(System.currentTimeMillis());

//futureTask.get()会阻塞当前线程,直到futureTask执行完毕

Integer result = futureTask.get();

System.out.println(System.currentTimeMillis() + “:” + result);

}

}

输出:

1566736319925

1566736319970

1566736322972:10

创建了一个FutureTask对象,调用futureTask.get()会阻塞当前线程,子线程中休眠了3秒,然后调用futureTask.run();当futureTask的run()方法执行完毕之后,futureTask.get()会从阻塞中返回。

注意:这种方式和方式4的不同点。

关于FutureTask详细使用,请参考:JUC中的Executor框架详解1

方式6:CompletableFuture方式实现


代码:

package com.itsoku.chat31;

import java.util.concurrent.CompletableFuture;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.FutureTask;

import java.util.concurrent.TimeUnit;

/**

* 跟着阿里p7学并发,微信公众号:javacode2018

*/

public class Demo6 {

public static void main(String[] args) throws ExecutionException, InterruptedException {

System.out.println(System.currentTimeMillis());

CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {

try {

TimeUnit.SECONDS.sleep(3);

} catch (InterruptedException e) {

e.printStackTrace();
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

一份还热乎的蚂蚁金服面经(已拿Offer)面试流程4轮技术面+1轮HR

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
va开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

[外链图片转存中…(img-yW95gaZo-1713204641052)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值