Java并发框架Executor

Executor:可管理Thread对象,它在客户端和任务执行之间提供了一个间接层。它允许我们管理异步任务的执行,而无需显示的管理线程的生命周期。

创建线程池:
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

都是在上一个线程执行完了在执行下一个线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值