1.主线程里创建N个子线程,等待N个子线程全部执行完后,打印每个子线程执行的时间。
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 主线程里创建N个子线程,等待N个子线程全部执行完后,打印每个子线程执行的时间。
* 一种可行的方法
*/
public class MainThread {
public static void main(String[] args) throws InterruptedException {
int threadNum = 5;
CountDownLatch latch = new CountDownLatch(threadNum);
Map<String, Long> map = new ConcurrentHashMap<String, Long>(threadNum);
ExecutorService pool = Executors.newFixedThreadPool(threadNum);
for (int i=0; i < threadNum; i++) {
pool.submit(new SubThread(latch, map));
}
latch.await(); //计数减到0时一直等待
for (Map.Entry<String, Long> entry : map.entrySet()) {
System.out.println(entry.getKey() + "执行耗时:" + entry.getValue() + "毫秒");
}
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(1, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(1, TimeUnit.SECONDS)) {
System.err.println("Pool did not terminate");
}
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
}
class SubThread implements Runnable {
private CountDownLatch latch;
private Map<String, Long> map;
public SubThread(CountDownLatch latch, Map<String, Long> map) {
this.latch = latch;
this.map = map;
}
@Override
public void run() {
long start = System.currentTimeMillis();
System.out.println(Thread.currentThread() + "开始执行...");
try {
Thread.sleep(1000); //模拟执行操作
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread() + "执行完毕");
map.put(Thread.currentThread().toString(), end-start);
}
}
相关推荐
数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis()在后一个子进程结束后...
创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...
创建一个带有3个子线程的程序,第1个线程启动10ms后,第2个线程再启动,然后等候10ms后第3个线程启动,每一个线程从1~100循环输出线程的名称和计数,当3个线程结束时输出各自的结束信息,然后主线程结束。
创建一个带三个子线程的程序,第一个线程启动10ms后,第二个线程再启动,然后再等待10ms后第三个线程启动,每一个线程从1—1000循环输出线程的名称和计数,当三个线程结束时要输出各自的结束信息,然后主线程结束。
在控制台创建两个线程以后,此时任务管理器出现3个线程(一个主线程+2个子线程)。 每隔一定时间检查线程1,2的动作情况。 线程1退出后,关闭线程1句柄 线程2退出后,不关闭线程2句柄 手动关闭线程2句柄。 任务管理器...
改程序主要是测试在主线程中启动多个线程,然后每个线程启动一个进程,通过管道获取子进程的结果,然后把各个子线程的结果进行统一等待后返给主线程。
主线程创建20个子线程,分别实现FCFS调度、SJF调度、RR调度、优先级调度和多级队列调度,并且计算每个调度的平均等待时间。(其中优先级调度和多级队列调度为选做)。 对于每个子线程,在其运行期间,输出其占用的...
创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...
在主线程中使用系统调用" "CreateThread()创建一个子线程。主线程创建子线程后进入阻塞状态,直到子" "线程运行完毕后唤醒主线程。 " " " "具体操作过程:在Microsoft Visual C++ " "6.0环境下建立一个MFC支持的...
创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...
创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...
(原Mutex 类的程序示例有点问题, 4个子线程获取到mutex后都没有执行ReleaseMutex()方法, 导致出现:由于出现被放弃的 mutex,等待过程结束 的异常, 这个是因为需要在获取mutex的线程里面执行ReleaseMutex()方法的, ...
采用synchronized关键字、volatile、ReebtrabtLook类与阻塞列队LinkedBlockingQueue,完成主线程与子线程的同步,要求子线程先执行,在主线程中使用Thread类创建一个子线程,主线程创建后进入阻塞状态,直到子线程...
主线程创建一个子线程,获取QAudioOutput一个周期所需要的数据量,循环的从文件中取出一个周期的数据量压入子线程的队列。 子线程创建后返回QAudioOutput一个周期所需要的数据量,开始等待主线程压入数据,当数据...
使用多线程是为了实现并发处理,主线程负责接收来自物联网设备的数据,并进行参数数据解析和协议转换。同时,多个子线程被创建来处理不同的功能和操作。其中一个子线程负责Socket收发功能,将数据发送到远程服务器或...
主线程里使用快速排序QuickSort,其他四个算法分别建立四个子线程,在子线程中进行排序。因为每一个线程都要调用函数PrintResult把结果输出到显示器上,所以不同的线程就会争夺着向显示器输出,这样,不同线程的输出...
创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程 均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...
前言 果然起名才是码农最大的考验,躲过了撸码的变量起名,却绕不开博客名重复率高。言归正传,关于子线程更新UI的文章,网上资料已经很多了,但还是总结了一下。...不可免俗的要举个子线程更新UI的例子,通过在在o
广告机除了循环播放视频以外,还需要实现网络...主进程里等待mplayer进程视频播放完毕完成新视频切换,在主线程里还有一个线程,用来检测服务器是否有新的视频文件需要更新,然后在合适的时间进行定时下载视频文件。
开一个子线程来完成一个循环处理的工作,我在主线程中能灵活控制这个子线程的开始、暂停/继续、结束。