博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 面试知识点笔记(八)多线程与并发 中篇
阅读量:7243 次
发布时间:2019-06-29

本文共 2028 字,大约阅读时间需要 6 分钟。

hot3.png

问:如何给run()方法传参?

  1. 构造函数传参
  2. 成员变量传参
  3. 回调函数传参

问:如何实现处理线程的返回值?

  1. 主线程等待法(实现简单,缺点是需要自己写等待逻辑,当等待变量多时代码臃肿,而且无法明确等待时间,无法精准控制。不推荐使用)
    1. 6a6e93386cd85ec2c98545ce2ad92ad19c0.jpg
  2. 使用Thread类的join()阻塞当前线程以等待子线程处理完毕(实现简单,精准控制。不过粒度不够细,比如子线程10次循环,想要第5次的时候去执行另一个子线程的run方法无法实现)
    1. 2a57e9d272fab7a97befd62fdb8a55b69a5.jpg
  3. 通过Callable接口实现:通过FutureTask Or 线程池获取
package interview.thread;import java.util.concurrent.Callable;/** * @Author: cctv * @Date: 2019/5/17 10:59 */public class MyCallable implements Callable {    @Override    public Object call() throws Exception {        String value = "我可以跟你耗一整天";        System.out.println("Ready to work");        Thread.sleep(3000);        System.out.println("task done");        return value;    }}
package interview.thread;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;/** * FutureTask方法获取线程返回值 * @Author: cctv * @Date: 2019/5/17 11:01 */public class FutureTaskDemo {    public static void main(String[] args) throws ExecutionException, InterruptedException {        FutureTask task = new FutureTask(new MyCallable());        new Thread(task).start();        if(!task.isDone()){            System.out.println("Task has not finished, please wait!");        }        // get可以阻塞知道子线程返回 也可以加个超时参数        System.out.println("task return :"+task.get());    }}
package interview.thread;import java.util.concurrent.*;/** * 线程池获取返回值 * @Author: cctv * @Date: 2019/5/17 11:10 */public class ThreadPoolDemo {    public static void main(String[] args) {        ExecutorService threadPool = Executors.newCachedThreadPool();        Future
future = threadPool.submit(new MyCallable()); if(!future.isDone()){ System.out.println("Task has not finished, please wait!"); } try { System.out.println("task return :"+future.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { threadPool.shutdown(); } }}

使用线程池可以并发操作。两种方法同样都输出:

7bb70300faf6f549027df60755f5f01f560.jpg

   

 

 

转载于:https://my.oschina.net/pentakill/blog/3050728

你可能感兴趣的文章
「每天一道面试题」说一下Spring框架中Bean的生存周期
查看>>
云南加快发展乡村旅游 摆脱“美丽的贫困”
查看>>
五大联赛半程战罢:三卫冕冠军强势 两队欲颠覆王权
查看>>
银川机场4万张机场巴士免票送高校学生
查看>>
高校获批数据科学与大数据技术专业,《云计算》教材怎么选?
查看>>
前端面试查漏补缺--Index篇(12万字符合集)
查看>>
大白话说java并发工具类-CountDownLatch,CyclicBarrier
查看>>
玩转 iOS 开发:Aggregate 脚本版本《模拟器与真机静态 Framework 合成教程》
查看>>
String、StringBuffer与StringBuilder
查看>>
ReactNative源码篇:启动流程
查看>>
vue-awesome-swiper 小案例
查看>>
聊聊Dubbo(四):核心源码-切入Spring
查看>>
Koa 源码浅析
查看>>
dpdk-lvs的一次线上故障排查报告
查看>>
记一次ios系统select标签第一个选项不能被选中的bug
查看>>
即构科技金健忠:回顾20年音视频技术演进
查看>>
tcpkill工作原理分析
查看>>
Kubernetes性能测试实践
查看>>
使用有限状态机原理实现英文分词
查看>>
阿里十年,只剩下这套Java开发体系了
查看>>