标签:
Java通过Executors提供四种线程池,分别为:
1 public class NewCachedThreadPool { 2 public static void main(String[] args) throws InterruptedException { 3 ExecutorService es = Executors.newCachedThreadPool(); 4 RunnableTest1 rt = new RunnableTest1(); 5 es.execute(rt); 6 Thread.sleep(2000); 7 System.out.println("sleep finish"); 8 es.execute(rt); 9 } 10 } 11 12 class RunnableTest1 implements Runnable { 13 public void run() { 14 for (int i = 0; i < 100; i++) { 15 System.out.println(Thread.currentThread().getName() + "...." + i); 16 } 17 } 18 }
如果上一个任务已经使用线程完毕,下一个任务会调用之前的线程,不会再创建;如果任务没有完毕,会创建新线程。
1 public class NewFixedThreadPool { 2 public static void main(String[] args) throws InterruptedException { 3 ExecutorService es = Executors.newFixedThreadPool(2); 4 RunnableTest rt = new RunnableTest(); 5 es.execute(rt); 6 Thread.sleep(2000); 7 System.out.println("sleep finish"); 8 es.execute(rt); 9 } 10 } 11 12 class RunnableTest implements Runnable { 13 public void run() { 14 for (int i = 0; i < 100; i++) { 15 System.out.println(Thread.currentThread().getName() + "...." + i); 16 } 17 } 18 }
规定线程池里面最大线程数,定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。
1 public class NewScheduledThreadPool { 2 public static void main(String[] args) { 3 ScheduledExecutorService es = Executors.newScheduledThreadPool(2); 4 RunnableTest2 rt = new RunnableTest2(); 5 es.scheduleAtFixedRate(rt, 0, 3, TimeUnit.SECONDS); 6 es.execute(rt); 7 } 8 } 9 10 class RunnableTest2 implements Runnable { 11 public void run() { 12 for (int i = 0; i < 100; i++) { 13 System.out.println(Thread.currentThread().getName() + "...." + i); 14 } 15 } 16 }
可以设置线程的延迟时间以及隔多久执行一次,注意这里是调用ScheduledExecutorService的scheduleAtFixedRate()方法,与其他线程池不同。
1 public class NewSingleThreadExecutor { 2 public static void main(String[] args) { 3 ExecutorService es = Executors.newSingleThreadScheduledExecutor(); 4 RunnableTest3 rt = new RunnableTest3(); 5 es.execute(rt); 6 es.execute(rt); 7 } 8 } 9 10 class RunnableTest3 implements Runnable { 11 public void run() { 12 for (int i = 0; i < 100; i++) { 13 System.out.println(Thread.currentThread().getName() + "...." + i); 14 } 15 } 16 }
会将并行的线程按一定排序串行执行。
我们可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池,它们的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务可能永远无法终止。但是它们存在一定的区别,shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。
只要调用了这两个关闭方法的其中一个,isShutdown方法就会返回true。当所有的任务都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法会返回true。至于我们应该调用哪一种方法来关闭线程池,应该由提交到线程池的任务特性决定,通常调用shutdown来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow。
标签:
原文地址:http://www.cnblogs.com/gforce/p/5909691.html