package com.example.concurrent.exector; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * Created by 程序亦非猿 on 15/10/20. */ public class ExectorMain { public static void main(String[] args) { // cache(); // fixed(); // single(); threadPoolExecutor(); } private static void cache() { //为 ExecutorService cached = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { cached.execute(new MyThread()); } cached.shutdown(); //Notice shutdown 后调用 报错: Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@3fee733d rejected from java.util.concurrent.ThreadPoolExecutor@5acf9800[Shutting down, pool size = 5, active threads = 5, queued tasks = 0, completed tasks = 0] // cached.submit(new MyThread()); /** * log: * Thread-0;11 Thread-3;17 Thread-2;15 Thread-1;13 Thread-4;19 */ } private static void fixed() { //指定并发数,超过的需要排队 ExecutorService executor = Executors.newFixedThreadPool(3); for (int i = 0; i < 5; i++) { executor.execute(new MyThread()); } executor.shutdown(); /** * log: Thread-1;13 Thread-2;15 Thread-0;11 //--间隔了2秒再输出-- Thread-3;17 Thread-4;18 */ } private static void single() { //一次只能执行一个,如果有多个任务,得排队 ExecutorService executor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 5; i++) { executor.execute(new MyThread()); } executor.shutdown(); /** * log: * 按顺序输出,并每次间隔2秒 * Thread-0;11 Thread-1;13 Thread-2;14 Thread-3;15 Thread-4;16 */ } private static void threadPoolExecutor() { BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(128); ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 0, TimeUnit.MILLISECONDS, queue); for (int i = 0; i < 5; i++) { executor.execute(new MyThread()); } } private static class MyThread extends Thread { @Override public void run() { super.run(); System.out.println(getName() + ";" + getId()); try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } }