每次启动一个线程都要创建一个新的浪费资源,还有时间线程过多的时候会造成服务器崩溃,所有有了线程池来管理线程,下面介绍几种常见创建线程的方式:
一、创建大小不固定的线程池
这是具有缓冲功能的线程池,系统根据需要创建线程。线程会被缓冲到线程池中,如果线程池大小超过了处理任务所需的线程,线程池就会回收线程,当任务增加时,线程池可以增加线程来处理任务,线程池不会对线程的大小进行限制,线程池的大小依赖于操作系统。
public class CacheThreadPoolTest { public static void main(String[] args) { ExecutorService es = Executors.newCachedThreadPool(); for (int i = 0; i <10 ; i++) { CacheThreadPoolTest.Threadchi threadchi = new CacheThreadPoolTest.Threadchi(); es.execute(threadchi); } es.shutdown(); } private static class Threadchi implements Runnable{ @Override public void run() { for (int i = 0; i <10 ; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } } }
二、创建固定数量线程的线程池
创建具有一个可重用的,有固定数量的线程池。每次提交一个任务就提交一个线程,知道线程达到线程池大小,就不会再创建新线程了,线程池的大小达到最大后就稳定不变了,如果一个现场异常终止,则会创建新的线程。
/** * @author zhengzheng */ public class FixedThreadPoolTest { public static void main(String[] args) { ExecutorService es = Executors.newFixedThreadPool(3); for (int i = 0; i <10 ; i++) { es.execute(()->{ for (int j = 0; j <2 ; j++) { System.out.println(Thread.currentThread().getName()+":"+j); } }); } es.shutdown(); } }
三、创建单线程的线程池
创建只有一个线程的线程池,按照提交顺序执行,跟上个数量为1的是一样。
public class SingleThreadExecutorTest { public static void main(String[] args) { ExecutorService es = Executors.newSingleThreadExecutor(); for (int i = 0; i <5 ; i++) { MyThread thread = new MyThread(); es.execute(thread); } es.shutdown(); } private static class MyThread implements Runnable{ @Override public void run() { for (int i = 0; i <3 ; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } } }
四、创建定时线程
创建一个线程池,大小可以设置。此线程支持定时以及周期性的执行任务。
/** * @author zhengzheng046 */ public class ScheduledThreadPoolTest { public static void main(String[] args) { MyThread task = new MyThread(); ScheduledExecutorService es = Executors.newScheduledThreadPool(2); //参数1:目标对象 参数2:隔多长时间开始执行线程, 参数3:执行周期 参数4:时间单位 es.scheduleAtFixedRate(task,2,4, TimeUnit.SECONDS); //注意.不能执行es.shutdown().否则线程池立即关闭 //es.shutdown(); } private static class MyThread implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()+"开始执行任务"+System.currentTimeMillis()); } } }