java并发Executor、ExecutorService、ScheduledExecutorService接口

简介:在以往创建线程时,我们通常使用new Thread()创建一个类对象,通过start()方法运行一个线程,当有多个线程,就要用上面的方法多个创建,看起来非常繁琐,代码看起来也不是非常整洁。而在JUC包下其实已经提供了相关接口(Executor、ExecutorService、ScheduledExecutorService)来作为池化技术的基础,通过Executors工具类创建各种线程池,减少每次获取资源的消耗,提高对资源的利用率。在这里主要介绍上面所说的三个接口的方法使用

一、Executor接口:支持启动新任务的一个简单接口。
方法
java并发Executor、ExecutorService、ScheduledExecutorService接口_第1张图片
示例
以下ExecutorTest程序显示了如何在基于线程的环境中Executor接口的用法。

public class ExecutorTest {
	public static void main(String[] args) {
		Executor executor = Executors.newCachedThreadPool();
		executor.execute(new Task());
		ThreadPoolExecutor pool =(ThreadPoolExecutor)executor;
		pool.shutdown();
	}
	
	static class Task implements Runnable{

		@Override
		public void run() {
			try {
				Long duration = (long)(Math.random()*5);
				System.out.println("Running Task!");
				TimeUnit.SECONDS.sleep(duration);
				System.out.println("Task Completed");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

结果:
在这里插入图片描述

二、ExecutorService接口:Executor接口的子接口,并添加了功能来管理生命周期。
方法
java并发Executor、ExecutorService、ScheduledExecutorService接口_第2张图片
示例
以下ExecutorServiceTest程序显示了如何在基于线程的环境中ExecutorService接口的用法。

public class ExecutorServiceTest {
	
	public static void main(String[] args) throws InterruptedException{
		ExecutorService executor = Executors.newSingleThreadExecutor();
		try{
			executor.submit(new Task());
			System.out.println("Shutdown executor");
			executor.shutdown();
			executor.awaitTermination(5, TimeUnit.SECONDS);
		}catch(InterruptedException e){	
			System.err.println("tasks interrupted");
		}finally{
			if(!executor.isTerminated()){
				System.err.println("cancel non-finished tasks");
			}
			executor.shutdown();
			System.out.println("shutdown finished");
		}
	}
	
	static class Task implements Runnable{

		@Override
		public void run() {
			try{
				Long duration = (long)(Math.random()*20);
				System.out.println("Running Task!");
				TimeUnit.SECONDS.sleep(duration);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
			
		}
	}
}

结果
java并发Executor、ExecutorService、ScheduledExecutorService接口_第3张图片
三、ExecutorService接口:ExecutorService接口的子接口,并支持将来和/或定期执行任务。
方法
java并发Executor、ExecutorService、ScheduledExecutorService接口_第4张图片
示例
以下ScheduledExecutorServiceTest程序显示了基于线程的环境中ScheduledExecutorService接口的使用。

public class ScheduledExecutorServiceTest {
	
	public static void main(String[] args) {
		final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
		final ScheduledFuture<?> beepHandler = scheduledExecutorService.scheduleAtFixedRate(new BeepTask(), 2, 2, TimeUnit.SECONDS);
		scheduledExecutorService.schedule(new Runnable() {
			
			@Override
			public void run() {
				beepHandler.cancel(true);
				scheduledExecutorService.shutdown();
			}
		}, 10, TimeUnit.SECONDS);
	}
	
	static class BeepTask implements Runnable{

		@Override
		public void run() {
			System.out.println("beep");
		}
		
	}
}

结果
java并发Executor、ExecutorService、ScheduledExecutorService接口_第5张图片

你可能感兴趣的:(java并发编程)