`
113.com
  • 浏览: 76974 次
  • 来自: 广州
社区版块
存档分类
最新评论

主线程里创建N个子线程,等待N个子线程全部执行完

    博客分类:
  • java
阅读更多
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);
	}
	
}

 

分享到:
评论

相关推荐

    Java多线程–让主线程等待所有子线程执行完毕

     数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis()在后一个子进程结束后...

    进程和线程的创建 _实验报告.doc

    创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...

    C#创建子线程

    创建一个带有3个子线程的程序,第1个线程启动10ms后,第2个线程再启动,然后等候10ms后第3个线程启动,每一个线程从1~100循环输出线程的名称和计数,当3个线程结束时输出各自的结束信息,然后主线程结束。

    创建一个带三个子线程的程序,第一个线程启动10ms后

    创建一个带三个子线程的程序,第一个线程启动10ms后,第二个线程再启动,然后再等待10ms后第三个线程启动,每一个线程从1—1000循环输出线程的名称和计数,当三个线程结束时要输出各自的结束信息,然后主线程结束。

    线程句柄调试

    在控制台创建两个线程以后,此时任务管理器出现3个线程(一个主线程+2个子线程)。 每隔一定时间检查线程1,2的动作情况。 线程1退出后,关闭线程1句柄 线程2退出后,不关闭线程2句柄 手动关闭线程2句柄。 任务管理器...

    在线程中启动进程

    改程序主要是测试在主线程中启动多个线程,然后每个线程启动一个进程,通过管道获取子进程的结果,然后把各个子线程的结果进行统一等待后返给主线程。

    进程调度算法模拟

    主线程创建20个子线程,分别实现FCFS调度、SJF调度、RR调度、优先级调度和多级队列调度,并且计算每个调度的平均等待时间。(其中优先级调度和多级队列调度为选做)。 对于每个子线程,在其运行期间,输出其占用的...

    进程和线程的创建(linux) 源代码

    创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...

    操作系统线程的同步.doc

    在主线程中使用系统调用" "CreateThread()创建一个子线程。主线程创建子线程后进入阻塞状态,直到子" "线程运行完毕后唤醒主线程。 " " " "具体操作过程:在Microsoft Visual C++ " "6.0环境下建立一个MFC支持的...

    操作系统OS第2次实验报告.doc,实验二:进程和线程的创建

    创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...

    操作系统实验——获取当前系统运行进程的信息

    创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...

    C#多线程学习入门圣典(修改版)

    (原Mutex 类的程序示例有点问题, 4个子线程获取到mutex后都没有执行ReleaseMutex()方法, 导致出现:由于出现被放弃的 mutex,等待过程结束 的异常, 这个是因为需要在获取mutex的线程里面执行ReleaseMutex()方法的, ...

    操作系统的线程同步实验报告完整版

    采用synchronized关键字、volatile、ReebtrabtLook类与阻塞列队LinkedBlockingQueue,完成主线程与子线程的同步,要求子线程先执行,在主线程中使用Thread类创建一个子线程,主线程创建后进入阻塞状态,直到子线程...

    Qt实现的简单处理pcm裸流的demo

    主线程创建一个子线程,获取QAudioOutput一个周期所需要的数据量,循环的从文件中取出一个周期的数据量压入子线程的队列。 子线程创建后返回QAudioOutput一个周期所需要的数据量,开始等待主线程压入数据,当数据...

    LInux 平台下物联网网关(多线程实现),嵌入式项目

    使用多线程是为了实现并发处理,主线程负责接收来自物联网设备的数据,并进行参数数据解析和协议转换。同时,多个子线程被创建来处理不同的功能和操作。其中一个子线程负责Socket收发功能,将数据发送到远程服务器或...

    Mutex_Critical.rar_MUTEX算法_event_mfc 控制 界面_mfc中控_界面线程

    主线程里使用快速排序QuickSort,其他四个算法分别建立四个子线程,在子线程中进行排序。因为每一个线程都要调用函数PrintResult把结果输出到显示器上,所以不同的线程就会争夺着向显示器输出,这样,不同线程的输出...

    现代操作系统实验.docx

    创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程 均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对...

    任性,通过线程检查子线程照样更新UI

    前言 果然起名才是码农最大的考验,躲过了撸码的变量起名,却绕不开博客名重复率高。言归正传,关于子线程更新UI的文章,网上资料已经很多了,但还是总结了一下。...不可免俗的要举个子线程更新UI的例子,通过在在o

    嵌入式Linux下广告机项目源码.zip

    广告机除了循环播放视频以外,还需要实现网络...主进程里等待mplayer进程视频播放完毕完成新视频切换,在主线程里还有一个线程,用来检测服务器是否有新的视频文件需要更新,然后在合适的时间进行定时下载视频文件。

    Java多线程wait和notify

    开一个子线程来完成一个循环处理的工作,我在主线程中能灵活控制这个子线程的开始、暂停/继续、结束。

Global site tag (gtag.js) - Google Analytics