JDK5往后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,它们的区别是:
1, execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。——实现Runnable接口
2, submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。——实现Callable接口
public class Test {
public static void main(String[] args) {
testScheduledThreadPool();
}
/**
* newSingleThreadExecutor
* 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务
* 此线程池保证所有任务的执行顺序按照任务的提交顺序执行
*/
public static void testSingleThreadExecutor(){
ExecutorService executorService = Executors.newSingleThreadExecutor();
testExecutorService(executorService);
}
/**
* newFixedThreadPool
* 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
*/
public static void testFixedThreadPool(){
ExecutorService executorService = Executors.newFixedThreadPool(3);
testExecutorService(executorService);
}
/**
* newCachedThreadPool
* 此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
*/
public static void testCachedThreadPool(){
ExecutorService executorService = Executors.newCachedThreadPool();
testExecutorService(executorService);
}
/**
* newScheduledThreadPool
* 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求(定时任务)
*/
public static void testScheduledThreadPool(){
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
},1,3, TimeUnit.SECONDS);
}
/**
* 创建一个定长线程池,支持定时及周期性任务执行
* @param executor
*/
public static void testExecutorService(ExecutorService executor){
for (int i = 0 ; i < 10; i++){
final int index = i;
executor.execute(new Runnable() {
@Override
public void run() {
System.out.println(index);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
网友评论