【转】线程池与工作队列

原文地址:http://sunnylocus.iteye.com/blog/223327

程池的作用:

线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。

为什么要用线程池:

  1. 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
  2. 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

线程池代码:

  

测试用例代码:

  

运行结果:

View Code
 1 工作线程0等待任务...
 2 工作线程1等待任务...
 3 工作线程2等待任务...
 4 
 5 工作线程0开始执行任务...
 6 Hello world
 7 工作线程0等待任务...
 8 
 9 工作线程1开始执行任务...
10 Hello world
11 工作线程1等待任务...
12 
13 工作线程2开始执行任务...
14 Hello world
15 工作线程2等待任务...
16 
17 工作线程0开始执行任务...
18 Hello world
19 工作线程0等待任务...
20 
21 工作线程1开始执行任务...
22 Hello world
23 工作线程1等待任务...
24 
25 工作线程2开始执行任务...
26 Hello world
27 工作线程2等待任务...

——————————————————————以上是转贴的原文————————————————————————————————————————ThreadGroup 介绍

Class ThreadGroup

属于 java.lang.ThreadGroup

线程组是代表一组线程的集合。此外,一个线程组还可以包括其他的线程组。线程组构成一棵树,除了初始线程组的线程组,其中每有一个父。

允许一个线程访问其自己的线程组的信息,但不能访问有关其线程组的父线程组或任何其他线程组的信息。

每一个线程产生时,都会被归入某个线程组,视线程是在哪个线程组中产生而定。如果没有指定,则归入产生该子线程的线程组中。您也可以自行指定线程组,线程一旦归入某个组,就无法更换组。

java.lang.ThreadGroup类正如其名,可以统一管理整个线程组中的线程,您可以使用以下方式来产生线程组,而且一并指定其线程组:

ThreadGroup threadGroup1 = new ThreadGroup("group1");
ThreadGroup threadGroup2 = new ThreadGroup("group2");
Thread thread1 =
new Thread(threadGroup1, "group1's member");
Thread thread2 =
new Thread(threadGroup2, "group2's member");

ThreadGroup中的某些方法,可以对所有的线程产生作用,例如interrupt()方法可以interrupt线程组中所有的线程,setMaxPriority()方法可以设置线程组中线程所能拥有的最高优先权(本来就拥有更高优先权的线程不受影响)。

如果您想要一次获得线程组中所有的线程来进行某种操作,可以使用enumerate()方法,例如:

Thread[] threads = new Thread[threadGroup1.activeCount()];
threadGroup1.enumerate(threads);

activeCount()方法获得线程组中正在运行的线程数量,enumerate()方法要传入一个Thread数组,它将线程对象设置到每个数组字段中,然后就可以通过数组索引来操作这些线程。

ThreadGroup中有一个uncaughtException()方法。当线程组中某个线程发生Unchecked exception异常时,由执行环境调用此方法进行相关处理,如果有必要,您可以重新定义此方法,直接使用范例ThreadGroupDemo.java来示范如何实现。

范例ThreadGroupDemo.java

package onlyfun.caterpillar;
import java.io.*;
public class ThreadGroupDemo {
public static void main(String[] args) {
ThreadGroup threadGroup1 =
// 这是匿名类写法
new ThreadGroup("group1") {
// 继承ThreadGroup并重新定义以下方法
// 在线程成员抛出unchecked exception
// 会执行此方法
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t.getName() + ": "
+ e.getMessage());
}
};
        // 这是匿名类写法
Thread thread1 =
// 这个线程是threadGroup1的一员
new Thread(threadGroup1,
new Runnable() {
public void run() {
// 抛出unchecked异常
throw new RuntimeException("测试异常");
}
});
        thread1.start();
}
}

在uncaughtException()方法的参数中,第一个参数可以获得发生异常的线程实例,而第二个参数可以获得异常对象,范例中显示了线程的名称及异常信息,结果如下所示:

Thread-0: 测试异常
原文地址:https://www.cnblogs.com/ainubis/p/3985888.html