在线程池里面创建线程,使用线程池可以很好地提高性能,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线
- Executors.newCacheThreadPool()
public class ThreadPoolExecutorTest { public static void main(String[] args) { //创建一个线程池 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { Thread.sleep(1000);//每隔一秒创建一个线程 cachedThreadPool.execute(new Runnable() { public void run() { //打印正在执行的缓存线程信息 System.out.println(Thread.currentThread().getName()+"正在被执行"); } }); } } }
- Executors.newFixedThreadPool(int n)
public class ThreadPoolExecutorTest { public static void main(String[] args) { //创建一个可重用固定个数的线程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { fixedThreadPool.execute(new Runnable() { //很厉害的匿名内部类 public void run() { try { //打印正在执行的缓存线程信息 System.out.println(Thread.currentThread().getName()+"正在被执行"); Thread.sleep(2000); //每隔2秒轮流打印3个线程的名字 } catch (InterruptedException e) { e.printStackTrace(); } } }); } } }
- Executors.newSingleThreadExecutor()
public class TestThreadPoolExecutor { public static void main(String[] args) { //创建一个单线程化的线程池 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { /*index为不可变量,每一次for循环后本次final变量出了这个块的作用域范围就 会失效,下次循环的时候重建一个不同域的final变量,故不同域对应的线程使用 不同的index*/ final int index = i; singleThreadExecutor.execute(new Runnable() { public void run() { try { //结果依次输出,相当于顺序执行各个任务 System.out.println(Thread.currentThread().getName()+"正在被执 行,打印的值是:"+index); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }); } } }
- Executors.newScheduledThreadPool(int n)
- 定时执行
public class ThreadPoolExecutorTest { public static void main(String[] args) { //创建一个定长线程池,支持定时及周期性任务执行——延迟执行 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); //延迟1秒执行 scheduledThreadPool.schedule(new Runnable() { public void run() { System.out.println("延迟1秒执行"); } }, 1, TimeUnit.SECONDS);//1秒后执行一次即over } }
- 周期性执行
public class ThreadPoolExecutorTest { public static void main(String[] args) { //创建一个定长线程池,支持定时及周期性任务执行——定期执行 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); /*延迟1秒后执行该任务,以后每隔3秒再次执行该任务,每隔3秒若上次任务已完成则 启动本次任务,否则等上次任务结束后才启动本次任务(尽管已经到了3秒)*/ scheduledThreadPool.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("延迟1秒后再每3秒执行一次"); } }, 1, 3, TimeUnit.SECONDS); } }