线程池建立方式jdk1.5
Java经过Executors(jdk1.5并发包)提供四种线程池,分别为:java
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * newCachedThreadPool建立一个可缓存线程池,若是线程池长度超过处理须要,可灵活回收空闲线程,若无可回收,则新建线程 * 线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程 * 此线程池不会对线程池大小作限制,线程池大小彻底依赖于操做系统(或者说JVM)可以建立的最大线程大小 */ public class CachedThreadPoolDemo { public static void main(String[] args){ ExecutorService threadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int temp = i; threadPool.execute(()->{ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+",i"+temp); }); } } }
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 建立一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 */ public class FixedThreadPoolDemo { public static void main(String[] args){ int a = Runtime.getRuntime().availableProcessors();//当前设备的CPU个数 System.out.println(a);//4 ExecutorService threadPool = Executors.newFixedThreadPool(a); for (int i = 0; i < 10; i++) { final int temp = i; threadPool.execute(()->{ //由于线程池大小为a,每一个任务输出temp后sleep 2秒,因此每两秒打印a个数字 System.out.println(Thread.currentThread().getName()+",i:"+temp); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }); } } }
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * 建立一个定长线程池,支持定时及周期性任务执行 */ public class ScheduledThreadPoolDemo { public static void main(String[] args){ ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(5); for (int i = 0; i < 10; i++) { final int temp = i; threadPool.schedule(() -> { System.out.println("i:"+temp); },3, TimeUnit.SECONDS); //延迟3秒执行 } } }
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * - scheduleAtFixedRate (Runnable command,long initialDelay,long period,TimeUnit unit) * 以上一个任务的开始时间为起点,以后的period时间,调度下一次任务 * 建立一个周期性任务。任务开始于给定的初始延时。后续的任务按照给定的周期进行:后续第一个任务将会在 * initialDelay+period时执行,后续第二个任务将在initialDelay+2*period时执行,依此类推 */ public class ScheduledThreadPoolDemo2 { public static void main(String[] args){ ScheduledExecutorService service = Executors.newScheduledThreadPool(10); service.scheduleAtFixedRate(()->{ try { //Thread.sleep(1000);//执行时间为一秒 Thread.sleep(8000);//执行时间为8秒 System.out.println(System.currentTimeMillis()/1000); } catch (InterruptedException e) { e.printStackTrace(); } },0,2, TimeUnit.SECONDS);//周期为2秒 } //1567587961 //1567587963 //1567587965 //1567587967 //1567587969 //时间间隔为2秒 //1567588064 //1567588072 //1567588080 //时间间隔为8秒 //周期若是过短,那么任务就会在上一个任务结束后,当即被调用。 }
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * - scheduleWithFixedDelay(Runnable command,long initialDelay,long delay, TimeUnit unit) * 在上一个任务结束后,再通过delay时间进行任务调度 * 建立并执行一个周期性任务。任务开始于初始延时时间。后续任务将会按照给定的延时进行,即上一个任务的结束 * 时间到下一个任务的开始时间的时间差。 */ public class ScheduledThreadPoolDemo3 { public static void main(String[] args){ ScheduledExecutorService service = Executors.newScheduledThreadPool(10); service.scheduleWithFixedDelay(()->{ try { //Thread.sleep(1000);//执行时间为一秒 Thread.sleep(8000);//执行时间为8秒 System.out.println(System.currentTimeMillis()/1000); } catch (InterruptedException e) { e.printStackTrace(); } },0,2, TimeUnit.SECONDS);//周期为2秒 } //1567588363 //1567588366 //1567588369 //1567588372 //1567588375 //1567588378 //时间间隔为3秒 //1567588623 //1567588633 //1567588643 //1567588653 //时间间隔为10秒 }
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 建立一个单线程化的线程池,它只会用惟一的工做线程来执行任务,保证全部任务按照指定顺序(FIFO, LIFO, 优先级)执行 * 结果依次输出,至关于顺序执行各个任务 */ public class SingleThreadExecutorDemo { public static void main(String[] args){ ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index = i; threadExecutor.execute(()->{ System.out.println("index:"+index); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } }); } } }