Java 线程池
public class ThreadPoolDemo {
public static void main(String[] args) {
/**
* 总结: 池中线程数量固定,不会发生变化 使用无界的LinkedBlockingQueue,要综合考虑生成与消费能力,生成过剩,可能导致堆内存溢出。 适用一些很稳定很固定的正规并发线程,多用于服务器
*/
ExecutorService fixed = Executors.newFixedThreadPool(4);
/**
* 总结 池中线程时随着处理数据增加而增加 线程数并不是一直增加,如果有新任务需要执行时,首先查询池中是否有空闲线程并且还为到空闲截止时间,如果有,则使用空闲线程,如果没有,则创建新线程并放入池中。 用于执行一些生存期很短的异步型任务。不适用于IO等长延时操作,因为这可能会创建大量线程,导致系统崩溃。
* 使用SynchronousQueue作为阻塞队列,如果有新任务进入队列,必须队列中数据被其他线程处理,否则会等待。
*/
ExecutorService cached = Executors.newCachedThreadPool();
/**
* 总结: 线程中只有一个线程在执行 适用于有明确执行顺序但是不影响主线程的任务,压入池中的任务会按照队列顺序执行。 使用无界的LinkedBlockingQueue,要综合考虑生成与消费能力,生成过剩,可能导致堆内存溢出。
*/
ExecutorService single = Executors.newSingleThreadExecutor();
/**
* 创建一个定长线程池,支持定时及周期性任务执行。
*/
ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(5);
for (int i = 0; i < 50; i++) {
fixed.submit(new ThreadRunner((i + 1)));
cached.submit(new ThreadRunner((i + 1)));
single.submit(new ThreadRunner((i + 1)));
scheduled.schedule(new ThreadRunner((i + 1)), 3, TimeUnit.SECONDS);// 延迟3秒执行
}
scheduled.scheduleWithFixedDelay(new ThreadRunner((1)), 1, 3, TimeUnit.SECONDS);// 定期执行,3秒执行一次
fixed.shutdown();
cached.shutdown();
single.shutdown();
scheduled.shutdown();
}
}
class ThreadRunner implements Runnable {
private final SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss.SSS");
private Integer num;
public ThreadRunner(Integer num) {
this.num = num;
}
@Override
public void run() {
System.out.println("thread:" + Thread.currentThread().getName() + ",time:" + format.format(new Date()) + ",num:" + num);
}
}