}
}
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* CachedThreadPool
*/
public class ThreadTestWithExecutor {
private static final int count = 5;
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0;i exec.execute(new LiftOff());
}
exec.shutdown();
//3.使用FixThreadPool
ExecutorService exec2 = Executors.newFixedThreadPool(3);
for(int i=0;i exec2.execute(new LiftOff());
}
exec2.shutdown();
//4.SingleThreadExecutor
ExecutorService exec3 = Executors.newSingleThreadExecutor();
for(int i=0;i exec3.execute(new LiftOff());
}
exec.shutdown();
System.out.println("执行完毕!");
}
}
这几段代码,都很简单,但是有几点需要说明
1)shutdown()方法的调用可以防止新任务被提交给这个Executor,当前线程(在上述代码中就是驱动main()的线程)将继续运行在shutdown()被调用之前提交的所有任务。
换句说,虽然是shutdown了,但是当前在执行器中的线程仍然会继续执行。
2)FixedThreadPool可以一次性预先执行代价高昂的线程分配(因而就可以限制线程的数量了)。这样会节省时间,因为你不用为每个任务都固定的付出创建线程的时间(记住,虽然每次new了一个Runnable对象,但是并不是每个Runnable对象都会new一次Thread.),直接从线程池中取线程即可。 但是,我们一定要记住一点,在任何线程池中,现有线程在可能的情况下, 都会被复用。
3)SingleThreadExecutor就像是线程数量为1的FixedThreadPool。这时候如果向其提交了多个任务,这些任务就会排队。每个任务都会在下一个任务开始之前运行结束。所有的任务将使用相同的线程。