Java并发框架Executor
2015-12-24 23:15
411 查看
Executor:可管理Thread对象,它在客户端和任务执行之间提供了一个间接层。它允许我们管理异步任务的执行,而无需显示的管理线程的生命周期。
创建线程池:
Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
1、Executors.newCachedThreadPool():
CachedThreadPool:在线程的执行过程中通常会创建与所需数量相同的线程,然后在他回收旧线程时停止创建新线程。因此,它是合理的Executors首选。
2、Executors.newFixedThreadPool():
FixedThreadPool():使用了有限的线程集来执行所提交的事务。可以一次性预先执行代价高昂的线程分配,因而也就可以限制线程的数量了。此时,不需要为每个任务都固定的付出创建线程的开销。在事件驱动的系统中,需要线程的事件处理器,通过直接从池中获取线程,也可以尽快的得到服务。规定数目的线程处理所有任务,一旦有线程处理完了任务就会被用来处理新的任务(如果有的话)。新的线程加入后,如果正在运行的线程达到了上限,则会阻塞,直到有了空闲的线程来运行
3、Executors.newSingleThreadPool():
SingleThreadPool:就像是线程数量为1的FixedThreadPool。向SingleThreadExecutor提交多个任务时,这些任务将排队,每个任务都会在下一个任务开始之前运行结束,所有的任务都将使用相同的线程。采用SingleThreadExecutor来处理大量的线程时,可以确保时刻在任何线程中都只有唯一的任务在运行。在这种方式中,不需要再共享资源上处理同步。
创建线程池:
Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
1、Executors.newCachedThreadPool():
CachedThreadPool:在线程的执行过程中通常会创建与所需数量相同的线程,然后在他回收旧线程时停止创建新线程。因此,它是合理的Executors首选。
public class TestExecutors { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); cachedThreadPool.execute(new Thread( new TestThread("t1"))); cachedThreadPool.execute(new Thread( new TestThread("t2"))); cachedThreadPool.shutdown(); } } class TestThread implements Runnable{ String name; public TestThread(String name){ this.name= name; } @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<5;i++){ System.out.println(name+":"+i); } } } 输出结果为: t1:0 t1:1 t1:2 t1:3 t1:4 t2:0 t2:1 t2:2 t2:3 t2:4
2、Executors.newFixedThreadPool():
FixedThreadPool():使用了有限的线程集来执行所提交的事务。可以一次性预先执行代价高昂的线程分配,因而也就可以限制线程的数量了。此时,不需要为每个任务都固定的付出创建线程的开销。在事件驱动的系统中,需要线程的事件处理器,通过直接从池中获取线程,也可以尽快的得到服务。规定数目的线程处理所有任务,一旦有线程处理完了任务就会被用来处理新的任务(如果有的话)。新的线程加入后,如果正在运行的线程达到了上限,则会阻塞,直到有了空闲的线程来运行
public class TestExecutors { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService exec = Executors.newFixedThreadPool(2); for(int i = 0; i < 4; i++) { exec.execute(new Thread( new TestThread("t"+i))); } exec.shutdown(); } } class TestThread implements Runnable{ String name; public TestThread(String name){ this.name= name; } @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<2;i++){ System.out.println(name+":"+i); } } } 输出结果为: t0:0 t0:1 t0:2 t0:3 t1:0 t2:0 t1:1 t2:1 t1:2 t2:2 t1:3 t2:3 t3:0 t4:0 t3:1 t4:1 t3:2 t4:2 t3:3 t4:3 同时只有两个线程在执行
3、Executors.newSingleThreadPool():
SingleThreadPool:就像是线程数量为1的FixedThreadPool。向SingleThreadExecutor提交多个任务时,这些任务将排队,每个任务都会在下一个任务开始之前运行结束,所有的任务都将使用相同的线程。采用SingleThreadExecutor来处理大量的线程时,可以确保时刻在任何线程中都只有唯一的任务在运行。在这种方式中,不需要再共享资源上处理同步。
public class TestExecutors { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService exec = Executors.newSingleThreadExecutor(); for(int i = 0; i < 3; i++) { exec.execute(new Thread( new TestThread("t"+i))); } exec.shutdown(); } } class TestThread implements Runnable{ String name; public TestThread(String name){ this.name= name; } @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<4;i++){ System.out.println(name+":"+i); } } } 输出结果为: t0:0 t0:1 t0:2 t0:3 t1:0 t1:1 t1:2 t1:3 t2:0 t2:1 t2:2 t2:3 都是在上一个线程执行完了在执行下一个线程
相关文章推荐
- java zipoutputstream 的使用
- Java数字图像处理基础知识
- Java快速排序原理理解
- 模拟收音机播放音乐
- Java [Leetcode 169]Majority Element
- java enum(枚举)使用详解 + 总结
- struts2
- Java Unicode 编码互转
- Java API —— 异常
- 基于Spring Boot构建的Spring MVC快速入门
- Intellij idea 配置JDK
- Java NIO1:I/O模型概述
- java线程池使用
- 从头认识java-14.4 Java提供的数组的实用功能(2)
- myeclipse 10和myeclipse2015软件和破解工具
- Java的单例模式
- 为javasript中对象与json串之间转换的总结。
- java 读取 excel
- Java中Runnable和Thread的区别
- JDK,JRE,JVM,SDK,API,ADT,OOM,ANR