原创转载请注明出处:http://agilestyle.iteye.com/blog/2343390
使用Executors的newCachedThreadPool()创建的是无界线程池,可以进行线程的自动回收。
所谓的“无界线程池”就是池中存放线程个数是理论上的Integer.MAX_VALUE最大值。
ExecutorTest1.java
package org.fool.java.concurrent.executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExecutorTest1 { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(new Runnable() { @Override public void run() { try { System.out.println("Runnable 1 begin " + System.currentTimeMillis()); Thread.sleep(1000); System.out.println("Thread A"); System.out.println("Runnable 1 end " + System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } }); executorService.execute(new Runnable() { @Override public void run() { try { System.out.println("Runnable 2 begin " + System.currentTimeMillis()); Thread.sleep(1000); System.out.println("Thread B"); System.out.println("Runnable 2 end " + System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } }); } }
Run
Note:
线程A和线程B机会是同一时间开始执行的,2个线程之间是异步执行的。
扫描二维码关注公众号,回复:
543244 查看本文章
ExecutorTest2.java
package org.fool.java.concurrent.executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExecutorTest2 { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); for(int i = 0; i < 5; i++) { executorService.execute(new Runnable() { @Override public void run() { System.out.println("invoked!"); } }); } } }
Run
复用线程对象
MyThread.java
package org.fool.java.concurrent.executor; public class MyThread implements Runnable { private String name; public MyThread(String name) { this.name = name; } @Override public void run() { System.out.println(Thread.currentThread().getName() + " name=" + name + " begin " + System.currentTimeMillis()); System.out.println(Thread.currentThread().getName() + " name=" + name + " end " + System.currentTimeMillis()); } }
ExecutorTest3.java
package org.fool.java.concurrent.executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExecutorTest3 { public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newCachedThreadPool(); for(int i = 0; i < 5; i++) { executorService.execute(new MyThread(String.valueOf(i + 1))); } Thread.sleep(1000); System.out.println(); for(int i = 0; i < 5; i++) { executorService.execute(new MyThread(String.valueOf(i + 1))); } } }
Run
使用newCachedThreadPool(ThreadFactory threadFactory)定制线程工厂
MyThreadFactory.java
package org.fool.java.concurrent.executor; import java.util.concurrent.ThreadFactory; public class MyThreadFactory implements ThreadFactory { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); thread.setName("My Own Thread"); return thread; } }
ExecutorTest4.java
package org.fool.java.concurrent.executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExecutorTest4 { public static void main(String[] args) throws InterruptedException { MyThreadFactory myThreadFactory = new MyThreadFactory(); ExecutorService executorService = Executors.newCachedThreadPool(myThreadFactory); executorService.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + " invoked..."); } }); } }
Run