- 浏览: 252130 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (298)
- 工作感悟 (6)
- java基础 (23)
- 计算机硬件知识 (1)
- 计算机网络知识 (2)
- Struts (3)
- Srping (4)
- hibernate (0)
- ibatis (0)
- webservice (4)
- Thread (22)
- maven (5)
- ubuntu/linux/centos/redhat (46)
- SSO (1)
- ESB (0)
- 工作流 (0)
- oracle (15)
- 云计算 (1)
- hadoop (1)
- nosql (0)
- mysql (3)
- sqlserver (0)
- jquery (0)
- 分布式 (3)
- 集群 (0)
- 设计模式 (2)
- EJB (0)
- map (0)
- cache (5)
- Niginx+varnish+squid+Ats (14)
- Apache (0)
- 工作/职业规划 (0)
- Scala & Groovy (1)
- English (4)
- 数据结构/算法 (6)
- 开发工具 (5)
- 测试 (2)
- Exception (0)
- 定时器 (3)
- j2ee (2)
- 部署 (1)
- Openssl (1)
- 操作系统 (3)
- kvm (13)
- libvirt (5)
- PostgreSql (5)
- 虚拟化 (3)
- 概念理解 (1)
- virt-manager (1)
- RESTful (3)
- 其它 (4)
- ssh2 (14)
- windows (1)
- 房产 (2)
- svn (1)
- 手机 (1)
- ant (1)
- flume (2)
- sqoop (1)
- fastdfs (5)
- log4j (1)
- SPDY (1)
- mongodb (2)
- MQ (2)
- Mina (1)
- dubbo (4)
- PMP (1)
- Webshpere (2)
- jvm (1)
- Btrace (1)
- zookeeper (7)
- UML (1)
- spring cloud (6)
- spring boot (5)
- storm (0)
- 软件管理 (1)
- elasticsearch (1)
- 协议 (2)
- docker (1)
- 性能 (2)
- 安全 (1)
- 代码规范 (1)
- mqtt (1)
- lombok (1)
- 车联网 (1)
- kafka (1)
最新评论
package com.jimmy.Thread.ConcurrentTools; import static java.lang.System.out; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; class TaskWithResult implements Callable<String> { private int id; public TaskWithResult(int id) throws InterruptedException { this.id = id; } @Override public String call() throws Exception { TimeUnit.SECONDS.sleep(2); return "result of TaskWithResult " + id; } } public class CallableTest { public static void main(String[] args) throws Exception { // test1(); test3(); } /** * 用 Join()方法等待所有子线程执行完,再收集执行结果 * @throws Exception */ public static void test2() throws Exception { List<Thread> list = new ArrayList<Thread>(); ExecutorService exec = Executors.newCachedThreadPool(); ArrayList<FutureTask<String>> results = new ArrayList<FutureTask<String>>(); // Future // 相当于是用来存放Executor执行的结果的一种容器 for (int i = 0; i < 10; i++) { Callable<String> callable = new TaskWithResult(i); FutureTask<String> futureTask = new FutureTask<String>(callable); Thread thread = new Thread(futureTask); thread.start(); results.add(futureTask); list.add(thread); } long time0 = System.currentTimeMillis(); for(Thread thread:list){ thread.join(); } out.println("共耗时:" + (System.currentTimeMillis()-time0)); String string = null; for (FutureTask<String> fs : results) { if(fs.isDone()){ try { string = fs.get(); } catch (Exception e) { e.printStackTrace(); } out.println(string); }else{ out.println("is not done!"); } } exec.shutdown(); } /** * 以BlockingQueue阻塞队列显式的接受子线程的返回值,操控灵活 * @throws Exception */ public static void test1() throws Exception { ExecutorService pool = Executors.newCachedThreadPool(); BlockingQueue<Future<String>> blockingQueue = new ArrayBlockingQueue<Future<String>>(10); CompletionService<String> service = new ExecutorCompletionService<String>(pool,blockingQueue); // 相当于是用来存放Executor执行的结果的一种容器 for (int i = 0; i < 10; i++) { Callable<String> callable = new TaskWithResult(i); service.submit(callable); } String string = null; int count = 0; while(true){ Future<String> future = blockingQueue.take(); string = future.get(); count ++; out.println(future.isDone() + "..value:===" + string); if(count == 10){ break; } } pool.shutdown(); } /** * 此种方式获取子线程的值是最为方便 * @throws Exception */ public static void test3() throws Exception { ExecutorService pool = Executors.newCachedThreadPool(); CompletionService<String> service = new ExecutorCompletionService<String>(pool); // 相当于是用来存放Executor执行的结果的一种容器 for (int i = 0; i < 10; i++) { Callable<String> callable = new TaskWithResult(i); service.submit(callable); } String string = null; for (int i = 0; i < 10; i++) { Future<String> future = service.take();//阻塞模式循环获取队列的值 string = future.get(); out.println(string); } pool.shutdown(); } }
发表评论
-
Java通过Executors提供四种线程池
2017-09-27 10:21 439Java通过Executors提供四种线程池,分别为: new ... -
并发线程组件 Amino
2013-07-23 13:29 663Amino CBB (Concurrent Building ... -
Java多线程之Semaphore
2013-07-17 16:12 561import java.util.ArrayL ... -
ThreadLocal的介绍(利用变量副本实现多线程访问同一变量)
2013-07-17 14:20 765早在Java 1.2推出之时,Ja ... -
ThreadGroup其实比ExecutorService更好
2013-07-17 13:32 673用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多 ... -
Java多线程同步器
2013-07-12 17:00 837CyclcBarrier 在实际应用中,有时候需要多个线程 ... -
Java Thread.interrupt 害人! 中断JAVA线程
2013-07-12 16:37 750程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难 ... -
Java多线程学习——Condition的使用
2013-07-12 14:36 789Condition 将 Object 监视器方法(wait、n ... -
java多线程设计wait
2013-07-12 14:30 662在Java中,这个机制的实 ... -
Monitor
2013-07-12 10:44 15021. 什么是Monitor? Monitor其实是一 ... -
ExecutorService的execute和submit方法
2013-07-05 17:21 940因为之前一直是用的exec ... -
Exchanger-兄弟线程的信息交换
2013-07-05 16:23 665如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使 ... -
lockInterruptibly 和lock的区别
2013-06-26 16:36 839lockInterruptibly 与 lock比较区别在于 ... -
慎重使用volatile关键字
2013-06-26 11:10 709volatile关键字相信了解Java多线程的读者都很清楚它的 ... -
对synchronized(this)的一些理解
2013-06-26 10:18 649一、当两个并发线程访问同一个对象object中的这个synch ... -
java中的lock和synchronized区别
2013-06-26 10:02 5631、ReentrantLock 拥有Synchronized相 ... -
线程sleep,join,yield的区别
2013-06-21 17:37 4801.sleep() 使当前线程(即调用该方法的线程)暂停执行 ... -
初学Java多线程:慎重使用volatile关键字
2013-02-25 15:18 663学习Java多线程中会遇到使用volatile关键字的情况。v ... -
java之yield(),sleep(),wait()区别详解-备忘笔记
2013-02-25 14:32 6051、sleep() 使当前线程(即调用该方法的线程)暂停执行 ... -
Java Thread join() 的用法
2013-02-25 13:24 560Java Thread中, join() 方法主要是让调用改方 ...
相关推荐
7、 浅析 Java Thread.join() : java多线程实现主线程等待所有子线程执行完毕 16 8、 线程运行中抛出异常的处理 19 9、 Callable 有返回值的线程 20 10、 Callable结合FutureTask的多线程使用(免打扰模式) 24
5. 声明并编写线程函数,注意只能有一个参数,且函数的返回值类型也是固定的;函数名可以自定义; DWORD WINAPI ThreadFun(LPVOID pthread);//线程入口函数 6. 在启动按钮的消息处理函数中编写如下代码: thread1....
48_通过handler和message在子线程里面去更新UI.avi 49_多线程断点下载的实现&界面的更新.avi 50_如何避免掉程序出现anr异常.avi 51_隐式意图和显示意图.avi 52_activity之间传递数据&批量传递数据.avi 53_启动...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 57、介绍Collection框架的结构 58、Collection框架中实现比较要实现什么接口 59、...
【练习】:使用pthread_join函数将循环创建的多个子线程回收。 【pthrd_loop_join.c】 pthread_detach函数 实现线程分离 int pthread_detach(pthread_t thread); 成功:0;失败:错误号 线程分离状态:指定该...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 57、介绍Collection框架的结构 58、Collection框架中实现比较要实现什么接口 59、...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 ...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 42 57、介绍Collection框架的结构 47 58、Collection框架中实现比较要实现什么接口 47 ...
56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43...
Overloaded 的方法是否可以改变返回值的类型? ......................................................................................................................................... 14 19、构造器 ...