一、线程组ThreadGroup 在java中,创建线程时,新创建的线程默认属于创建它的组,Thread.currentThread().getThreadGroup().getName() 可以看到线程所属的组, 为了便于管理,在新建线程时也可以指定线程归入哪个线程组,通过ThreadGroup的interrupt()方法可以终止该组的所有线程,不必逐个线程线程 ThreadGroup threadGroup = new ThreadGroup("group name"); Thread thread1 = new Thread(threadGroup, "thread name"); 二、线程池ThreadPoolExecutor 主要用途,先创建好一些线程,根据需要会自动创建,用于执行一些指定的任务,优点:不必执行任务时才去创建线程, 例子,设计一个线程池,线程用于处理某任务 /*1.创建一个任务类,必须实现runable接口*/ public Task implement runnable{ private String value; public run(){ // 任务要做的事情是把value输出到控制台 System.out.print(value); } public Task(String v){ value=v; } } /*2. demo类管理一个线程线,提供执行任务的入口,和关闭方法*/ publice Demo{ ThreadPoolExecutor executor; //线程池类 public Demo(){ executor = new ThreadPoolExecutor( CORE_THREADS_PER_VOLUME, MAXIMUM_THREADS_PER_VOLUME, THREADS_KEEP_ALIVE_SECONDS, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory); /*hb:参数说明: corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的缓冲队列 handler: 线程池对拒绝任务的处理策略 */ // This can reduce the number of running threads executor.allowCoreThreadTimeOut(true); } /* 执行任务 */ synchronized void execute( Runnable task) { executor.execute(task); // chb:通过线程池执行一个任务,任务是实现runable接口 /*当一个任务通过execute(Runnable)方法欲添加到线程池时: 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。 也就是:处理任务的优先级为: 核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。 */ } /* 关闭线程线*/ synchronized void shutdown() { executors.shutdown(); } }