您的位置:首页 > 编程语言 > Java开发

Java核心技术(多线程)三

2011-04-21 10:28 281 查看

执行器

构建一个新的线程是有一定代价的,如果程序中创建了大量的生命期很短的线程,就应该使用线程池。一个线程池中包含许多准备运行的空

闲线程。将Runnable对象交给线程池,就会有一个线程调用run方法。当run方法准备退出时,线程不会死亡,而是在池中准备为下一个请求提

供服务。另一个使用线程池的理由是减少并发线程的数目。

Executor有许多静态工厂方法用来构建线程池。

ThreadPoolExecutor类对象实现了ExecutorServiec接口,调用submit方法可以将一个Runnable对象或Callable对象提交给ExecutorService。调用submit时,会得到一个Future对象,可用来查询该任务的状态。当用完一个线程池的时候调用shutdown。该方法启动该池的关闭序列。被关闭的执行器不再接受新的任务。当所有任务都完成以后,线程池中的线程死亡。调用shutdownNow取消尚未开始的所有任务并试图中断正在运行的线程。

newCachedThreadPool:必要时创建新线程;空闲线程被保留60秒。

newFixedThreadPool:包含固定数量的线程。

newSingleThreadExecutor:顺序执行每一个提交的任务,类似于Swing事件分配线程。

ScheduleExecutorService接口具有预订执行或重复执行任务而设计的方法。可以预订Runnable或Callable在初始的延迟之后只运行一

次,也可以预订一个Runnable对象周期性地运行。

newScheduledThreadPool:用于预订执行而构建的固定线程池。

newSingleThreadScheduleExecutor:用于预订执行而构建的单线程"池"。

下面程序演示ThreadPoolExecutor创建线程池的方法:对于newCachedThreadPool,线程全部启动;对于newFixedThreadPool方法,先启动固定数量的线程,每完成一个线程就会启动一个新线程;newSingleThreadExecutor方法,所有的线程均等待上一个线程执行完毕再执行。

public class ExecutorDemo {

public static void main(String[] args){
new ExecutorDemo(0);
}

public ExecutorDemo(int key) {
ExecutorService service = null;
switch (key) {
case 0:
service = Executors.newCachedThreadPool();
break;
case 1:
service = Executors.newFixedThreadPool(5);
break;
case 2:
service = Executors.newSingleThreadExecutor();
break;
default:
return;
}
for(int i=0;i<9;i++){
service.execute(new PerThread(i));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
service.shutdown();
}
class PerThread implements Runnable {
public PerThread(int count) {
this.count = count;
}
public void run() {
try {
System.out.println("begin:" + count);
Thread.sleep(2000);
System.out.println("end:" + count);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

private int count = 0;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: