- Java 线程池:
- ThreadPoolExecutor,创建此线程池的方法:
- new
- Executors.newCachedThreadPool():尽量避免使用,其无法控制线程数量,
- ScheduledThreadPoolExecutor:定时执行;
- ThreadPoolExecutor,创建此线程池的方法:
1. Thread
- Thread.yield():静态方法,其实对线程调度器(Java 线程机制的一部分,可将 CPU 从一个线程转移到另一个线程),意在告诉编译器“我已经执行完生命周期中最重要的部分了,此刻正是切换给其他嗷嗷待哺的任务执行一段时间的大好机会”。
将 Runnable 对象提交给 Thread 构造器,使用 Thread 对象来驱动 Runnable 对象的执行;
public class Liftoff implements Runnable{} // 不使用 Thread 的驱动方式 public class MainThread { public static void main(String[] args) { Liftoff launch = new Liftoff(); launch.run(); } } // 使用 Thread 的驱动方式 public class BasicThread { public static void main(String[] args) { Threaad t = new Thread(new Liftoff()); t.start(); } }
2. Executor
java.util.concurrent 包中的 Executor(执行器,Java SE5 以后)用于管理 Thread 对象,以简化并发编程。
Executor 在客户端和任务执行之间提供了一个间接层。
public class CachedThreadPool {
public static void main(Srting[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; ++i) {
exec.execute(new Liftoff());
}
exec.shutdown();
}
}
3. 线程池:不使用线程池与使用线程池
使用线程池
ThreadPoolExecutor tp = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(COUNT)); for (int i = 0; i < COUNT; ++i) { tp.executor(new Runnable(){ @Override public void run() { .... } }); }
不使用线程池
for (int i = 0; i < COUNT; ++i) { Thread thread = new Thread(){ @Override public void run(){ ... } } thread.start(); }
使用线程池与不使用线程池的显著差异就在于,使用线程池的方式是复用线程的,而不使用线程池则需要每次都创建新的线程,在一个循环中不断地创建对象,显然是一件效率底下的事情。
4. 使用 ThreadPoolExecutor 创建线程池而非 Executors.newCachedThreadPool()
Java 中创建线程池,除了 ThreadPoolExecutor,还有定时的线程池 ScheduledPoolExecutor。需要注意的是对于 Executors.newCachedThreadPool() 方法返回的线程池的使用,该方法返回的线程池是没有线程上限的,使用时需要格外的小心,因为没有方法控制总体的线程数量,而每个线程都是消耗内存的,这可能会导致过多的内存占用。建议不要使用这个方法返回的线程池,而是使用固定线程上限的线程池。