-
线程的实现方式
-
线程池的使用
newCachedThreadPool 和 SingleThreadExecutor 的区别主要有corePoolSize、maximunPoolSize和阻塞队列用的是SynchronousQueue,当使用的阻塞队列是SynchronousQueue时,corePoolSize的大小已经失效,newCachedThreadPool 只会重用空闲并且可用的线程,当没有可用的线程时,将会继续创建新的线程,所以个人不是很建议使用。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
示例代码:
public class CachedThreadPoolTest { // 线程数 private static final int threads = 10; // 用于计数线程是否执行完成 CountDownLatch countDownLatch = new CountDownLatch(threads); /** * newCachedThreadPool execute * * @throws ExecutionException * @throws InterruptedException */ @Test public void test1() throws InterruptedException { System.out.println("---- start ----"); ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < threads; i++) { cachedThreadPool.execute(() -> { try { System.out.println(Thread.currentThread().getName()); } catch (Exception e) { System.out.println(e); } finally { countDownLatch.countDown(); } }); } countDownLatch.await(); System.out.println("---- end ----"); } /** * newCachedThreadPool submit submit */ @Test public void test2() throws InterruptedException { System.out.println("---- start ----"); ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < threads; i++) { // Callable 带返回值 cachedThreadPool.submit(new Thread(new Runnable() { @Override public void run() { try { System.out.println(Thread.currentThread().getName()); } catch (Exception e) { e.printStackTrace(); } finally { countDownLatch.countDown(); } } })); } countDownLatch.await(); System.out.println("---- end ----"); } /** * newCachedThreadPool submit Callable * * @throws ExecutionException * @throws InterruptedException */ @Test public void test3() throws ExecutionException, InterruptedException { System.out.println("---- start ----"); ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < threads; i++) { // Runnable 带返回值 FutureTask<?> futureTask = new FutureTask<>(new Callable<String>() { /** * call * @return currentThreadName */ @Override public String call() { return Thread.currentThread().getName(); } }); cachedThreadPool.submit(new Thread(futureTask)); System.out.println(futureTask.get()); } System.out.println("---- end ----"); } }