并行计算
- 业务:任务多,数据量大
- 串行,并行
– 串行编程简单,并行编程困难
– 单个计算核频率下降,计算核数增多,整体性能变高(需要选择并行) - 并行困难(任务分配和执行过程的高度耦合)
– 如何分配粒度,切割任务
– 如何分配任务给线程,监督线程执行过程 - 并行模式
– 主从模式(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.