最近做项目,使用到了FutureTask和主线程并发,应用到实际中还是挺实用的,特在此总结一下。

有不对之处,忘各位多多指出。

 package com.demo;

 import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class FutureTaskTest { public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
long currentTimeMillis = System.currentTimeMillis();
FutureTask<String> future1 = new FutureTask<>(new MyTaskA());
new Thread(future1).start();// 一定要先开启线程,如果主线程在开启线程前调用,就没了并发的效果,可以自行测试
Thread.sleep(100);// 主线程耗时100ms
String r1 = future1.get();
System.out.println(r1);
System.err.println(i + "-----" + String.valueOf(System.currentTimeMillis() - currentTimeMillis) + "ms");
}
} static class MyTaskA implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(50);// 并发线程耗时50ms
return "testA";
}
} }

20-26行创建一个任务MyTaskA,实现的是Callable,主要是为了获取返回值(关于如何创建线程,这里就不在赘述);

11行创建FutureTask;

12行启动线程:此时任务MyTaskA就已经开始执行;

13行主线程执行耗时100ms的任务;

14行FutureTask获取返回值,该方法是会等待任务完成然后获取到返回值。

输出结果如下:

testA
0-----101ms
testA
1-----100ms
testA
2-----100ms
testA
3-----100ms
testA
4-----100ms
testA
5-----100ms
testA
6-----100ms
testA
7-----100ms
testA
8-----100ms
testA
9-----100ms

上面就是一个线程和主线程并发执行,下面再看一个两个线程和主线程并发,其实差别不大

 package com.demo;

 import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class FutureTaskTest { public static void main(String[] args) throws Exception{
for (int i = 0; i < 10; i++) {
long currentTimeMillis = System.currentTimeMillis(); FutureTask<String> futureA = new FutureTask<>(new MyTaskA());
FutureTask<String> futureB = new FutureTask<>(new MyTaskB());
new Thread(futureA).start();
new Thread(futureB).start(); Thread.sleep(100);
System.out.println(futureA.get()+"---"+futureB.get());
System.err.println(i+"-----"+String.valueOf(System.currentTimeMillis()-currentTimeMillis)+"ms");
}
}
static class MyTaskA implements Callable<String>{
@Override
public String call() throws Exception {
Thread.sleep(50);//并发线程耗时50ms
return "testA";
}
}
static class MyTaskB implements Callable<String>{
@Override
public String call() throws Exception {
Thread.sleep(50);
return "testB";
}
} }

执行结果如下

testA---testB
0-----103ms
testA---testB
1-----100ms
testA---testB
2-----100ms
testA---testB
3-----100ms
testA---testB
4-----100ms
testA---testB
5-----101ms
testA---testB
6-----100ms
testA---testB
7-----101ms
testA---testB
8-----100ms
testA---testB
9-----101ms

上面使用Thread启动的FutureTask,咱们也可以用线程池,代码如下

package com.demo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class FutureTaskTest { public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
long currentTimeMillis = System.currentTimeMillis();
ExecutorService executorService = Executors.newFixedThreadPool(2);
Future<String> futureA = executorService.submit(new MyTaskA());
Future<String> futureB = executorService.submit(new MyTaskB()); Thread.sleep(100);
System.out.println(futureA.get() + "---" + futureB.get());
System.err.println(i + "-----" + String.valueOf(System.currentTimeMillis() - currentTimeMillis) + "ms");
       executorService.shutdown();//注意:用完之后一定要关闭线程池
}
} static class MyTaskA implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(50);// 并发线程耗时50ms
return "testA";
}
} static class MyTaskB implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(50);
return "testB";
}
} }

输出结果如下

testA---testB
0-----104ms
testA---testB
1-----101ms
testA---testB
2-----101ms
testA---testB
3-----101ms
testA---testB
4-----100ms
testA---testB
5-----102ms
testA---testB
6-----101ms
testA---testB
7-----101ms
testA---testB
8-----101ms
testA---testB
9-----101ms

FutureTask并发详解,通俗易懂的更多相关文章

  1. Reactor And Gev 详解 通俗易懂

    reactor 详解 在类似网关这种海量连接, 很高的并发的场景, 比如有 10W+ 连接, go 开始变得吃力. 因为频繁的 goroutine 调度和 gc 导致程序性能很差. 这个时候我们可以考 ...

  2. java 并发 详解

    1 普通线程和 守护线程的区别. 守护线程会跟随主线程的结束而结束,普通线程不会. 2 线程的 stop  和 interrupted 的区别. stop 会停止线程,但是不会释放锁之类的资源? in ...

  3. Microsoft SQL Server中的事务与并发详解

    本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...

  4. EntityFramework Core解决并发详解

    前言 对过年已经无感,不过还是有很多闲暇时间来学学东西,这一点是极好的,好了,本节我们来讲讲EntityFramewoek Core中的并发问题. 话题(EntityFramework Core并发) ...

  5. Java--集合框架详解

    前言 Java集合框架的知识在Java基础阶段是极其重要的,我平时使用List.Set和Map集合时经常出错,常用方法还记不牢, 于是就编写这篇博客来完整的学习一下Java集合框架的知识,如有遗漏和错 ...

  6. 跟着阿里p7一起学java高并发 - 第19天:JUC中的Executor框架详解1,全面掌握java并发核心技术

    这是java高并发系列第19篇文章. 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadPoolExecutor及案例 介 ...

  7. 最强Java并发编程详解:知识点梳理,BAT面试题等

    本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解 ...

  8. 详解应对平台高并发的分布式调度框架TBSchedule

    转载: 详解应对平台高并发的分布式调度框架TBSchedule

  9. C++11 并发指南三(Lock 详解)

    在 <C++11 并发指南三(std::mutex 详解)>一文中我们主要介绍了 C++11 标准中的互斥量(Mutex),并简单介绍了一下两种锁类型.本节将详细介绍一下 C++11 标准 ...

随机推荐

  1. 今天俺要说一说装饰着模式(Decorator)

    前言:装饰者模式,又叫做装饰器模式.顾名思义,就是给对象包裹一层,包装.让它变成你喜欢的对象.这种模式在我们开发中经常会用到,它是一种处理问题的技巧,即不让程序死板,也可以扩展程序. (一)何时能用到 ...

  2. Python爬虫入门教程 11-100 行行网电子书多线程爬取

    行行网电子书多线程爬取-写在前面 最近想找几本电子书看看,就翻啊翻,然后呢,找到了一个 叫做 周读的网站 ,网站特别好,简单清爽,书籍很多,而且打开都是百度网盘可以直接下载,更新速度也还可以,于是乎, ...

  3. 你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?

    我想大部分都知道 i++ 和 ++i的区别,i++ 就是先拿i来使用,之后再自增加1,而++i则是先自增加1,在拿i来使用,例如对于下面这两个语句,我敢保证大部分人都会做: int i = 1; Sy ...

  4. Chapter 4 Invitations——14

    "Hi, Bella." “你好,Bella” "What's up?" I said as I was unlocking the door. “怎么了?” ...

  5. 初学Java Web(3)——第一个Servlet

    这学期 Java Web 课程的第一节课就简短复习了一下 Java 的一些基础知识,所以觉得 Java 的基础知识还是很重要的,但当我想要去写一篇 Java 回顾的文章的时候发现很难,因为坑实在太多了 ...

  6. Connection 对象简介 方法解读 JDBC简介(四)

    通过驱动管理器DriverManager的getConnection方法,可以创建到指定URL的连接     Connection conn = DriverManager.getConnection ...

  7. mpvue微信小程序多列选择器用法:实现省份城市选择

    前言 微信小程序默认给我们提供了一个省市区的picker选择器,只需将mode设置为region即可 <picker mode="region" bindchange=&qu ...

  8. 权限管理系统之LayUI实现页面增删改查和弹出层交互

    由于对LayUI框架不太熟悉,昨天抽空看了下LayUI的文档,今天在网上找了使用LayUI进行增删改查相关内容,自己照葫芦画了个瓢,画瓢部分不是很难,主要是下午遇到了一个弹出层的问题耗时比较久. 同一 ...

  9. [PHP] 频率限制类

    比如要实现 单个ip限制60秒1次单个关键字,比如手机号,限制60秒1次,3600秒10次 <?php class Sina_Mail_WebAntispam { const PREFIX_WH ...

  10. Java编程的逻辑 (51) - 剖析EnumSet

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...