- 浏览: 265388 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (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 468Java通过Executors提供四种线程池,分别为: new ... -
并发线程组件 Amino
2013-07-23 13:29 695Amino CBB (Concurrent Building ... -
Java多线程之Semaphore
2013-07-17 16:12 582import java.util.ArrayL ... -
ThreadLocal的介绍(利用变量副本实现多线程访问同一变量)
2013-07-17 14:20 803早在Java 1.2推出之时,Ja ... -
ThreadGroup其实比ExecutorService更好
2013-07-17 13:32 702用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多 ... -
Java多线程同步器
2013-07-12 17:00 860CyclcBarrier 在实际应用中,有时候需要多个线程 ... -
Java Thread.interrupt 害人! 中断JAVA线程
2013-07-12 16:37 768程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难 ... -
Java多线程学习——Condition的使用
2013-07-12 14:36 836Condition 将 Object 监视器方法(wait、n ... -
java多线程设计wait
2013-07-12 14:30 695在Java中,这个机制的实 ... -
Monitor
2013-07-12 10:44 15351. 什么是Monitor? Monitor其实是一 ... -
ExecutorService的execute和submit方法
2013-07-05 17:21 1033因为之前一直是用的exec ... -
Exchanger-兄弟线程的信息交换
2013-07-05 16:23 697如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使 ... -
lockInterruptibly 和lock的区别
2013-06-26 16:36 886lockInterruptibly 与 lock比较区别在于 ... -
慎重使用volatile关键字
2013-06-26 11:10 743volatile关键字相信了解Java多线程的读者都很清楚它的 ... -
对synchronized(this)的一些理解
2013-06-26 10:18 675一、当两个并发线程访问同一个对象object中的这个synch ... -
java中的lock和synchronized区别
2013-06-26 10:02 5901、ReentrantLock 拥有Synchronized相 ... -
线程sleep,join,yield的区别
2013-06-21 17:37 5141.sleep() 使当前线程(即调用该方法的线程)暂停执行 ... -
初学Java多线程:慎重使用volatile关键字
2013-02-25 15:18 694学习Java多线程中会遇到使用volatile关键字的情况。v ... -
java之yield(),sleep(),wait()区别详解-备忘笔记
2013-02-25 14:32 6331、sleep() 使当前线程(即调用该方法的线程)暂停执行 ... -
Java Thread join() 的用法
2013-02-25 13:24 587Java Thread中, join() 方法主要是让调用改方 ...
相关推荐
- **子线程**:在主程序运行时创建的新线程,可以用来执行一些独立的任务,如网络请求、文件读写等操作,从而提高程序的响应速度和效率。 #### 知识点二:Python中创建线程的方式 在Python中,可以通过`threading`...
6. 在主线程中,启动所有子线程后,使用一个循环不断检查`ImportThread.hasThreadRunning()`,直到返回值为`false`,表示所有子线程都已经完成。 这样,主线程会在所有子线程运行结束后才继续执行,而子线程则可以...
本文将详细探讨如何在多线程环境中确保所有子线程执行完毕后,主程序再进行后续操作,并且如何获取子线程的返回结果。这涉及到线程的同步与通信,是理解并发编程的关键点。 首先,多线程执行时,主线程会创建并启动...
但是,微软提供了Invoke 的方法,其作用就是让子线程告诉窗体线程来完成相应的控件操作。 例如,可以使用Invoke 方法来更新界面上的控件。例如,定义一个委托public delegate void MyInvoke(string str); 定义一个...
在C# WinForms应用开发中,子窗体与父窗体之间的数据传递是一个常见的需求,尤其是在需要用户输入或选择特定信息的场景下。...通过适当的错误处理和验证逻辑,可以进一步提升用户体验,确保数据的完整性和有效性。
`fork()`可能会因系统资源不足(如内存不足)而失败,此时需要检查返回值并适当地处理错误。 五、进程同步与等待 在多进程环境中,通常需要父进程等待子进程结束,这可以通过`wait()`或`waitpid()`函数实现。父...
而子线程通常用于执行非GUI任务,如数据处理或网络通信。默认情况下,当主线程(即包含`QApplication`的线程)退出时,所有关联的子线程也将被终止。但是,如果子线程中存在无限循环,且没有正确的退出机制,那么...
需要注意的是,使用`join()`方法是必要的,因为它确保主线程等待所有子线程结束,防止在结果未准备好时尝试获取结果。如果不使用`join()`,调用`get_result()`可能会因为线程还在执行而引发异常。 总结起来,Python...
总结来说,Python中获取多线程和子线程返回值主要有两种方式:一是自定义线程类,将结果存储在实例属性中;二是使用`Queue`对象进行线程间的通信,将结果存入队列,由主线程取出。无论哪种方式,都需要确保主线程...
5. 声明并编写线程函数,注意只能有一个参数,且函数的返回值类型也是固定的;函数名可以自定义; DWORD WINAPI ThreadFun(LPVOID pthread);//线程入口函数 6. 在启动按钮的消息处理函数中编写如下代码: thread1....
48_通过handler和message在子线程里面去更新UI.avi 49_多线程断点下载的实现&界面的更新.avi 50_如何避免掉程序出现anr异常.avi 51_隐式意图和显示意图.avi 52_activity之间传递数据&批量传递数据.avi 53_启动...
- 主线程调用`pthread_exit`时,所有非分离的子线程也将结束,除非它们已经设置为分离状态。 4. **线程安全与信号处理** - 当多线程进程捕获到信号,只会影响主线程,不影响其他子线程的执行。线程间信号处理需要...
主线程将大任务分解为多个小任务,然后分配给子线程进行排序。子线程完成后再由主线程合并结果。 4. **负载均衡**:为了最大化效率,线程间的任务分配应尽可能均匀。如果某个线程的任务过重,可能导致其他线程空闲...
一旦`join`,子线程的资源会被释放,其返回值(如果有)可以被主线程获取。 Perl线程的状态包括:创建(create)、运行(running)、执行完毕(finished execution)、joinable、已join(joined)或未分离...
主线程(父线程)在所有子线程创建完毕后,等待所有子线程执行完毕,然后输出`globalnum`的最终值。 ### 文件操作与信号处理 #### 示例3:文件操作与信号处理(部分代码缺失) 尽管这部分代码未完全展示,但可以...
接着,我们要构建一个主线程和两个子线程——读线程和写线程。主线程主要负责初始化串口、创建读写线程并管理整个通信过程。读线程则持续监控串口,一旦有数据到来,就调用`ReadFile`读取并处理数据。写线程则接收...
在多线程服务器中,如Web服务器,主线程通常不希望因等待子线程结束而被阻塞,这时可以在子线程启动时或运行中调用`pthread_detach(pthread_self())`。而`pthread_join()`则常用于需要获取子线程返回值或确保子线程...
在MFC中,主线程通常负责处理用户界面,而子线程执行计算任务。为了避免界面假死,子线程不应直接修改UI元素,而应使用`PostMessage()`或`AfxGetMainWnd()->PostMessage()`发送消息给主线程,由主线程来更新UI。这样...
这在处理大量数据或需要立即返回结果的情况下很有用,但需要注意的是,`BeginInvoke`可能会导致UI更新的顺序与子线程执行的顺序不同步。 总的来说,要安全地在C#的子线程中更新窗口部件,你需要使用`Invoke`或`...