Java 并发框架Executor 和Fork-Join

本文探讨了在面对大量任务和数据时,如何从串行编程转向并行计算以提高性能。Java提供的Executor框架和Fork-Join框架为并行编程提供了解决方案。Executor框架通过分离任务创建和执行,实现线程复用,避免了频繁创建线程的开销。Fork-Join框架则采用分治策略,适用于任务量不确定但可分解的情况,通过RecursiveAction和RecursiveTask进行任务分解与合并。
摘要由CSDN通过智能技术生成

并行计算

  • 业务:任务多,数据量大
  • 串行,并行
    – 串行编程简单,并行编程困难
    – 单个计算核频率下降,计算核数增多,整体性能变高(需要选择并行)
  • 并行困难(任务分配和执行过程的高度耦合
    – 如何分配粒度,切割任务
    – 如何分配任务给线程,监督线程执行过程
  • 并行模式
    – 主从模式(Master-Slave)(主线程指挥副线程)
    – Worker模式(Worker-Worker)(所有线程都是平等的)
  • Java并发编程
    – Thread/Runnable/Thread组管理
    – Executor框架
    – Fork-Join框架

线程组管理

线程组ThreadGroup

  • 线程的集合
  • 树形结构,大线程组可以包括小线程组
  • 可以通过enumerate方法遍历组内的线程,执行操作
  • 能够有效管理多个线程,但是管理效率低
  • 任务分配和执行过程的高度耦合 没有解决
  • 重复创建线程,关闭线程操作,无法重用线程(线程new出来后,只能start一次,不能再次start)

activeCount返回线程组中还处于active的线程数(估计数)
enumerate将线程组中active的线程拷贝到数组中
interrupt对线程组所有的线程发出interrupt信号
list打印线程组中所有的线程信息

public class Main {
   

	public static void main(String[] args) {
   

		// 创建线程组
		ThreadGroup threadGroup = new ThreadGroup("Searcher");
		Result result=new Result();

		// 创建一个任务,10个线程完成
		Searcher searchTask=new Searcher(result);
		for (int i=0; i<10; i++) {
   
			Thread thread=new Thread(threadGroup, searchTask);
			thread.start();
			try {
   
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
   
				e.printStackTrace();
			}
		}
		System.out.println("========华丽丽0=======");
		
		// 查看线程组消息
		System.out.printf("active 线程数量: %d\n",threadGroup.activeCount());
		System.out.printf("线程组信息明细\n");
		threadGroup.list();
		System.out.println("========华丽丽1=======");

		// 遍历线程组
		Thread[] threads=new Thread[threadGroup.activeCount()];
		threadGroup.enumerate(threads);
		for (int i=0; i<threadGroup.activeCount(); i++) {
   
			System.out.printf("Thread %s: %s\n",threads[i].getName(),threads[i].getState());
		}
		System.out.println("========华丽丽2=======");

		// Wait for the finalization of the Threadds
		waitFinish(threadGroup);  //等至少一个线程结束
		
		// Interrupt all the Thread objects assigned to the ThreadGroup
		threadGroup.interrupt();//向线程组里所有线程发送停止信号
	}

	public static void waitFinish(ThreadGroup threadGroup) {
   
		while (threadGroup.activeCount()>9) {
   
			try {
   
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
   
				e.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值