在上一篇文章中,讲述了线程的基本概念和用法,这里将继续讲述线程组和线程池的一些东西。
线程组:java.lang.ThreadGroup
1. 线程组的介绍
线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。允许线程访问有关自己的线程组的信息,但是不允许它访问有关其线程组的父线程组或其他任何线程组的信息。
2. 线程组的构造方法
ThreadGroup(String name) 构造一个新线程组。 ThreadGroup(ThreadGroup parent, String name) 创建一个新线程组。
上述第二个构造方法可以指定新创建的线程组的父亲线程组并指定当前线程组的名称。
3. 线程组的常用方法
线程组的常用方法和线程的常用方法一致,不过线程组执行方法影响的目标是线程组或者线程组内的具体的每个线程,例如setDaemon方法,在Thread中是表示将该现场设为守护线程,在剩下的只有守护线程是,JVM自动退出,而在线程组中,表示该组内最后一个现场销毁时,自动销毁该线程组。而interrupt这样的方法则表示中断该线程组中的所有线程。
4. 如何设置线程属于哪个组
Thread的构造方法中提供了设置线程组的构造方法,如下所示:
Thread(ThreadGroup group, Runnable target) 分配新的 Thread 对象。 Thread(ThreadGroup group, Runnable target, String name) 分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。 Thread(ThreadGroup group, Runnable target, String name, long stackSize) 分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小。 Thread(ThreadGroup group, String name) 分配新的 Thread 对象。
线程池:ExecutorService
1. 如何创建线程池对象
public static ExecutorService newFixedThreadPool(int nThreads)
该方法是Executors下的一个静态方法,Executors中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。
2. 如何提交线程执行
<T> Future<T> submit(Callable<T> task) 提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。 Future<?> submit(Runnable task) 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
3. 如何结束线程池
void shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。 List<Runnable> shutdownNow() 试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。
4. Future是啥,有什么作用
Future 是一个接口,它表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。那如何取得一个提交线程的运行结果呢?
我们知道Runnable中不提供线程结果的返回方法,所以我们要寻求新的工具类或者接口,它就是Callable。
Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。
5. Callable的应用--异步求和案例
import java.util.concurrent.*; public class ThreadTest { public static void main(String args[]) throws ExecutionException, InterruptedException { // 可以执行Runnable对象或者Callable对象代表的线程 ExecutorService pool = Executors.newFixedThreadPool(2); Future<Integer> f1 = pool.submit(new MyCallable(100)); Future<Integer> f2 = pool.submit(new MyCallable(200)); // V get() Integer i1 = f1.get(); Integer i2 = f2.get(); System.out.println(i1); System.out.println(i2); // 结束 pool.shutdown(); } } class MyCallable implements Callable<Integer> { private int number; public MyCallable(int number) { this.number = number; } @Override public Integer call() throws Exception { int sum = 0; for (int x = 1; x <= number; x++) { sum += x; } return sum; } }