线程池ExecutorService
来源:互联网 发布:网站搜索排名优化 编辑:程序博客网 时间:2024/06/18 09:18
ExecutorService,是一个接口,继承了Executor;
Executor,只有一个方法:
public interface Executor { void execute(Runnable command);}
Executors提供了4中创建线程池:
public static ExecutorService newCachedThreadPool(); 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
public static ExecutorService newFixedThreadPool(int nThreads); 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 创建一个定长线程池,支持定时及周期性任务执行。
public static ExecutorService newSingleThreadExecutor(); 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
通过Executors的以上四个静态工厂方法获得 ExecutorService实例,而后调用该实例的execute(Runnable command)方法即可。一旦Runnable任务传递到execute()方法,该方法便会自动在一个线程上执行。
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ExecutorTest { public static void main(String[] args){ ExecutorService executorService = Executors.newCachedThreadPool(); //ExecutorService executorService = Executors.newFixedThreadPool(3); // ExecutorService executorService = Executors.newSingleThreadExecutor(); for (int i = 0; i < 3; i++){ RunnableTest method = new RunnableTest(); executorService.execute(method); System.out.println("########" + i + "########"); } executorService.shutdown(); }}
public class RunnableTest implements Runnable{ public void run(){ System.out.println(Thread.currentThread().getName() + "线程执行"); } }
输出结果:
########0################1################2########pool-1-thread-2线程执行pool-1-thread-3线程执行pool-1-thread-1线程执行
任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,但是Runnable任务没有返回值,而Callable任务有返回值。并且Callable的call()方法只能通过ExecutorService的submit(Callable<T> task) 方法来执行,并且返回一个 <T>Future<T>,是表示任务等待完成的 Future。
下面给出一个Executor执行Callable任务的示例代码
public class ExecutorTest { public static void main(String[] args){ ExecutorService executorService = Executors.newCachedThreadPool(); //ExecutorService executorService = Executors.newFixedThreadPool(3); // ExecutorService executorService = Executors.newSingleThreadExecutor(); List<Future<String>> resultList = new ArrayList<Future<String>>(); for (int i = 0; i < 6; i++){ CallableTest method = new CallableTest(i); Future<String> future = executorService.submit(method); System.out.println("########" + i + "########"); resultList.add(future); } //遍历任务的结果 for (Future<String> fs : resultList){ try{ //Future返回如果没有完成,则一直循环等待,直到Future返回完成 while(!fs.isDone()); //打印各个线程(任务)执行的结果 System.out.println(fs.get()); }catch(InterruptedException e){ e.printStackTrace(); }catch(ExecutionException e){ e.printStackTrace(); }finally{ //启动一次顺序关闭,执行以前提交的任务,但不接受新任务 executorService.shutdown(); } } }}
import java.util.concurrent.Callable;public class CallableTest implements Callable<String>{ private int id; public CallableTest(int id){ this.id = id; } @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName() + "线程执行"); return Thread.currentThread().getName() + "线程执行" + "返回id=" + id; } }
输出结果:
pool-1-thread-1线程执行返回id=0pool-1-thread-2线程执行返回id=1pool-1-thread-3线程执行返回id=2pool-1-thread-4线程执行返回id=3pool-1-thread-2线程执行返回id=4pool-1-thread-4线程执行返回id=5
从结果中可以同样可以看出,submit也是首先选择空闲线程来执行任务,如果没有,才会创建新的线程来执行任务。另外,需要注意:如果Future的返回尚未完成,则get()方法会阻塞等待,直到Future完成返回,可以通过调用isDone()方法判断Future是否完成了返回。
- ExecutorService(线程池)+线程
- Android ExecutorService线程池
- ExecutorService线程池
- ExecutorService线程池
- ExecutorService线程池
- ExecutorService线程池
- 线程池ExecutorService newCachedThreadPool()
- ExecutorService线程池
- ExecutorService线程池
- Java ExecutorService 线程池
- ExecutorService线程池
- Android ExecutorService线程池
- Java ExecutorService 线程池
- ExecutorService线程池
- ExecutorService线程池
- Java ExecutorService 线程池
- ExecutorService线程池
- ExecutorService线程池
- hdu4965——Fast Matrix Calculation(快速矩阵幂优化)
- Spring中获取数据库表主键序列
- 如何正确配置Nginx+PHP
- java程序操作Geometry对象
- 基于zookeeper的主备切换方法
- 线程池ExecutorService
- Reabble.com-KindleRSS新闻杂志订阅
- 同步异步阻塞非阻塞区别
- Docker+Redis3集群环境搭建
- Git服务器的搭建
- 关于Redis数据过期策略
- LeetcodeUnique Paths
- ArcGIS Engine实现图层间空间选择的优化策略
- FBX SDK