2019独角兽企业重金招聘Python工程师标准>>>

线程非安全的方法getNext()

import net.jcip.annotations.NotThreadSafe;@NotThreadSafe
public class UnSafeSequence
{private int value;public int getNext(){return value++;}
}

1、最开始的目的是测试线程池执行getNext()方法的返回值

main函数如下:

public class UnSafeQequenceTest
{/*** @throws ExecutionException* @throws InterruptedException*/public static void main(String[] args){UnSafeSequence unSafeSequence = new UnSafeSequence();ExecutorService executors = Executors.newCachedThreadPool();for (int i = 0; i < 100; i++ ){executors.submit(() -> System.out.println(unSafeSequence.getNext()));}executors.shutdown();}}

结果如预期般是乱序的:

2、顺便试一下采用Future来接收线程执行的结果

main方法修改如下:

public class UnSafeQequenceTest
{/*** @throws ExecutionException* @throws InterruptedException*/public static void main(String[] args)throws InterruptedException, ExecutionException{UnSafeSequence unSafeSequence = new UnSafeSequence();List<Integer> lstNumber = new ArrayList<Integer>();ExecutorService executors = Executors.newCachedThreadPool();for (int i = 0; i < 100; i++ ){Future<Integer> future = executors.submit(() -> unSafeSequence.getNext());Integer temp = future.get();System.out.println(temp);lstNumber.add(temp);}Integer max = 0;for (Integer e : lstNumber){if (e >= max){max = e;}else{System.out.println(e);System.out.println(lstNumber);}}executors.shutdown();}}

然后执行的结果是:

输出的顺序没有丝毫问题,WTF?这好像不太正常啊

难道是Future对象获取线程返回结果时导致的主线程阻塞引起的以外效果?

转载于:https://my.oschina.net/u/3643816/blog/1942095

Future获取线程返回值能使线程顺序执行?相关推荐

  1. Future获取任务返回值

    Future获取任务返回值 submit方法签名 在向线程池ThreadPoolExecutor提交任务时,一般为了方便操作采用execute提交任务,这时线程其实是无返回值的,但是在生产中为了应对各 ...

  2. python 子线程返回值_python-从线程返回值

    python-从线程返回值 我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级? 12个解决方案 59 votes 我建议您在启动线程之前实例化Queue.Queue,并将其作为线程 ...

  3. Python 获取线程返回值获取

    Python 获取线程返回值获取 思路 重写run方法,使用线程的get_result()方法获取返回结果 '''示例: 多线程访问百度,统计平均响应时间和错误率''' class MyThread( ...

  4. 线程返回值的方式介绍

    博客 微博 相册 收藏 留言 关于我 线程返回值的方式介绍 博客分类: 多线程 Java代码   在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不 ...

  5. java开启线程的方法_Java有几种方法开启线程?怎么实现带有返回值的线程?

    Java有几种方法开启线程?怎么实现带有返回值的线程? 发布时间:2020-05-22 11:20:08 来源:亿速云 阅读:238 作者:Leah Java有几种方法开启线程?怎么实现带有返回值的线 ...

  6. Java线程详解(12)-有返回值的线程

    在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务(也可以叫做线程)了. 可返 ...

  7. Java线程:新特征-有返回值的线程(转)

    在Java5之前,线程是没有返回值的,常常为了"有"返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了. 现在Java终于有可返回值的任务(也可以叫做线程)了. 可 ...

  8. Java中使用有返回值的线程

    在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable,可以获取线程中的返回值,但是获取线程的返回值的时候,需 ...

  9. java callable接口_Java多线程之Callable接口的实现有返回值的线程

    import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util. ...

最新文章

  1. jquery获取对象
  2. 用ActivityGroup解决TabHost中多个Activity跳转问题
  3. python入门基础知识教程-Python基础知识入门,这三个原则是你要知道的,还有教程...
  4. python字符编码转换_Python字符和字符值(ASCII或Unicode码值)转换方法
  5. HTML——ASP的 Response.write 方法输出中文乱码解决方案
  6. STL源码剖析 空间配置器 查漏补缺
  7. PAT 乙级1005
  8. 计算机 游戏第24级,“24点”游戏五级竞赛法
  9. wpf 如何实现窗口浮动_如何实现工作表数据与UserForm窗口的交互,显示第一条记录...
  10. 全国地址SQL数据文件(精确到区县)
  11. 软件过程— 螺旋模型
  12. 从零开始学架构 04-计算高性能FMEA故障模式分析 【笔记】
  13. java 保留原始顺序的有序map的新思路:List<Map.Entry<?,?>>
  14. web端文字转语音播放的几种方式
  15. 正则表达式与文件格式处理-Linux(笔记)
  16. V4L2 pixel format 格式参考
  17. HTML5新特性知识点总结
  18. rust python_用于Python程序员的Rust
  19. jquery上传图片本地预览插件V1.2
  20. 西门子PLC中OB、FC、FB、SFC、SFB的区别是什么?

热门文章

  1. MATLAB和Python读取wave文件的波形对比
  2. Jsp实现图书馆借阅管理系统
  3. Design Pattern----06.Creational.Singleton.Pattern (Delphi Sample)
  4. Asp.net Mvc Post ID Bug
  5. FeiBoStr 斐波那契
  6. mvn打包的POm文件
  7. JAVA单线程以及java多线程的实现方式
  8. 建房子之前先挖地基 - Java BlockingQueue理解
  9. SSH框架搭建 笔记 (含spring注解驱动)
  10. 2.使用Connection对象连接数据库