Java Callable并发编程模板
submit方法会产生Future对象,它用Callable返回结果的特定类型进行了参数化,可以用isDone()的方法来查询Future是否已经完成。当任务完成是,它具有一个结果,可以调用get()方法来获取该结果。
/**
* @Title: TaskWithResult.java
* @Package zeze
* @Description: TODO(用一句话描述该文件做什么)
* @author A18ccms A18ccms_gmail_com
* @date 2017年2月8日 上午10:51:26
* @version V1.0
*/
package zeze; import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class CallableDemo {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
ArrayList<Future<String>> results = new ArrayList<Future<String>>();
for (int i = 0; i < 10; i++) {
results.add(exec.submit(new TaskWithResult(i)));
}
for (Future<String> fs : results) {
try {
System.out.println(fs.get());
} catch (Exception e) {
System.err.println(e);
} finally {
exec.shutdown();
}
} }
} class TaskWithResult implements Callable<String> { private int id; public TaskWithResult(int id) {
this.id = id;
} @Override
public String call() {
return "result of TaskWithResult " + id;
} }
用isDone()的方法来查询Future是否已经完成
boolean isDone = false;
while (!isDone) {
logger.info(Thread.currentThread().getName() + " 线程是否结束?"+ runningFlag+"; 队列大小=" + nextDepthQueue.size());
isDone = true;
for (Future<Object> future : futureList) {
if (!future.isDone()) {
isDone = false;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
break;
}
}
}
改进版:
package test; import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; /***
*
* @ClassName: EbayMultiplyThreadCheck
* @Description: TODO
* @author zeze
* @date 2017年2月16日 上午8:49:46
*
*/
public class EbayMultiplyThreadCheck {
public static void main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(10);
ArrayList<Future<String>> results = new ArrayList<Future<String>>(); for (int i = 0; i < 10; i++) {
String email = "asd" + i + "@qq.com";
results.add(exec.submit(new TaskWithResult(email)));
} boolean isDone = false;
while (!isDone) {
isDone = true;
for (Future<String> future : results) {
if (!future.isDone()) {
isDone = false;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
break;
}
}
}
exec.shutdown();
}
} class TaskWithResult implements Callable<String> { private String email; public TaskWithResult(String email) {
this.email = email;
} @Override
public String call() {
System.out.println(email);
return null;
} }
Runnable 实现:
/**
* @Title: RunnableDemo.java
* @Package zeze
* @Description: TODO(用一句话描述该文件做什么)
* @author A18ccms A18ccms_gmail_com
* @date 2017年3月13日 下午4:08:09
* @version V1.0
*/
package zeze; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import javafx.animation.Animation.Status; /**
* @ClassName: RunnableDemo
* @Description: TODO
* @author zeze
* @date 2017年3月13日 下午4:08:09
*
*/
public class RunnableDemo implements Runnable { protected int countDown = 10;
private static int taskCount = 0;
private final int id = taskCount++; public RunnableDemo() {
} public RunnableDemo(int countDown) {
this.countDown = countDown;
} public String status() {
return "#" + id + "(" + (countDown > 0 ? countDown : "LiftOff!") + ").";
} @Override
public void run() {
while (countDown-- > 0) {
System.out.print(status());
Thread.yield();// 将CPU从一个线程转移给另一个线程
}
} public static void main(String[] args) { System.out.println("这个任务的run()不是单独的线程驱动,是在main()中直接调用");
RunnableDemo launch = new RunnableDemo();
launch.run();
System.out.println();
System.out.println("************************************"); System.out.println("在新线程中启动任务");
Thread thread = new Thread(new RunnableDemo());
thread.start();
System.out.println("Waiting for LiftOff");
System.out.println("************************************"); System.out.println("添加多个线程去驱动更多的任务");
for (int i = 0; i < 5; i++) {
new Thread(new RunnableDemo()).start();
}
System.out.println("Waiting for LiftOff"); System.out.println("************************************");
System.out.println("使用executor");
ExecutorService exec = Executors.newCachedThreadPool();
exec=Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
exec.execute(new RunnableDemo());
}
exec.shutdown();
} }
Java Callable并发编程模板的更多相关文章
- 《Java虚拟机并发编程》学习笔记
对<Java虚拟机并发编程>这本书真的是相见恨晚.以前对并发编程只是懂个皮毛,这本书让我对并发编程有了一个全新的认识.所以把书上的知识点做下笔记,以便以后复习使用. 并发与并行 仔细说来, ...
- Java 多线程并发编程一览笔录
Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- java高并发编程(一)
读马士兵java高并发编程,引用他的代码,做个记录. 一.分析下面程序输出: /** * 分析一下这个程序的输出 * @author mashibing */ package yxxy.c_005; ...
- 关于Java高并发编程你需要知道的“升段攻略”
关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows ...
- Java高并发编程基础三大利器之CountDownLatch
引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...
- java多线程并发编程
Executor框架 Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService ...
- java高并发编程(五)线程池
摘自马士兵java并发编程 一.认识Executor.ExecutorService.Callable.Executors /** * 认识Executor */ package yxxy.c_026 ...
- Java基础系列篇:JAVA多线程 并发编程
一:为什么要用多线程: 我相信所有的东西都是以实际使用价值而去学习的,没有实际价值的学习,学了没用,没用就不会学的好. 多线程也是一样,以前学习java并没有觉得多线程有多了不起,不用多线程我一样可以 ...
随机推荐
- 4、第一个JAVA程序(Hello World)
第一步: 新建一个文本文档,在里面输入内容 public class HelloWorld { public static void main(String[] args){ System.out.p ...
- 如何让bat,cmd文件后台运行?如何把文件打包成EXE?
方法1:在“运行”中输入IEXPRESS 这是WINDOWS自带的打包程序,好像也可以生成安装包. 下一步-下一步-随便填个名字(下一步)-下一步-下一步-ADD(选好你的BAT文件 继 ...
- mysql优化不可不做的事情
写在前面的话:总是在灾难发生后,才想起容灾的重要性:总是在吃过亏后,才记得有人提醒过 设计原则 1.不在数据库做运算:cpu计算务必移至业务层 2.控制单表数据量:单表记录控制在1000w 3.控制列 ...
- <%@ include file="">和<jsp:include file="">区别
<%@include file="a.jsp"%>是在编译时加入,所谓静态,就是在编译的时候将jsp的代码加入进来再编译,之后运行. <jsp:include p ...
- HDUOJ-----2068RPG的错排
RPG的错排 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDUOJ---1867 A + B for you again
A + B for you again Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- linux常见面试题及答案
1. 在Linux系统中,以文件方式访问设备. 2. Linux内核引导时,从文件/etc/fstab中读取要加载的文件系统. 3. Linux文件系统中每个文件用i字节来标识. 4. 全部磁盘块由四 ...
- Google Chrome调试js代码,开发者工具之调试工具常用功能
参考:Google Chrome调试js代码-http://www.open-open.com/lib/view/open1384785324165.html 重点:左下角一个{}括号图标按钮用于把杂 ...
- Quartz2之入门示例
环境:XP+Myeclipse6.5+JDK1.6 quartz官网:http://www.quartz-scheduler.org/ 参考资料 1 Quartz任务调度快速入门 http://www ...
- 60款与DevOps相关的开源工具
原文地址:https://elasticbox.com/blog/de ... ools/ 你喜欢免费的东西吗?获得开发者社区支持的自动化,开源的工具是大家梦寐以求的.这里列举了 60+ 款最棒的开源 ...