Java的高并发编程系列(十)线程池1

认识Executor

执行提交的Runnable任务的对象。 这个接口提供了一种将任务提交与每个任务如何运行的机制解耦的方式,包括线程使用,调度等细节。通常使用Executor而不是显式创建线程。 例如,不是为一组任务中的每一个调用新Thread(new(RunnableTask()))。start(),你可以使用:

 Executor executor = anExecutor;
 executor.execute(new RunnableTask1());
 executor.execute(new RunnableTask2());

用法:

 class DirectExecutor implements Executor {
   public void execute(Runnable r) {
     r.run();
   }
 }

方法:

void execute(Runnable command)

将来在某个时间执行给定的命令。 执行程序可以根据执行程序的执行情况,在新线程,池线程或调用线程中执行该命令。

Callable

返回结果并可能抛出异常的任务。 实现者定义了一个没有参数称为call的单一方法。
Callable接口与Runnable类似,都是为其实例可能由另一个线程执行的类设计的。 但是,Runnable不会返回结果,也不会抛出检查的异常。Executors类包含从其他常见形式转换为Callable类的实用程序方法。

V call() throws Exception

计算结果,或者如果不能这样做则抛出异常。

当线程完毕后需要返回值时使用Callable,反之使用Runable

Executors

此包中定义的Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类的工厂和实用程序方法。
这个类支持以下几种方法: 创建并返回使用常用的配置设置设置的ExecutorService的方法。
创建并返回使用常用的配置设置的ScheduledExecutorService的方法。
创建并返回“包装的”ExecutorService的方法,通过使特定于实现的方法不可访问来禁用重新配置。
创建并返回将新创建的线程设置为已知状态的ThreadFactory的方法。
从其他闭包形式创建并返回一个Callable的方法,所以它们可以用在需要Callable的执行方法中。

线程池的概念

public class T05_ThreadPool {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(5); // new一个固定容量为5的线程池
        for (int i = 0; i < 6; i++) {
            service.execute(()->{
                try {
                    TimeUnit.MICROSECONDS.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            });
        }

        System.out.println(service);

        //线程池的关闭
        service.shutdown();
        System.out.println(service.isTerminated());
        System.out.println(service.isShutdown());
        System.out.println(service);

        TimeUnit.SECONDS.sleep(5);
        System.out.println(service.isTerminated());
        System.out.println(service.isShutdown());
        System.out.println(service);
    }
}

future

具有返回值

public class T06_Future {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        FutureTask<Integer> task = new FutureTask<>(()->{
            TimeUnit.MILLISECONDS.sleep(500);
            return 1000;
        }) ;//相当于new Callable(){Integer call();}

        new Thread(task).start();

        System.out.println(task.get()); //阻塞

        ExecutorService service = Executors.newFixedThreadPool(5);
        Future<Integer> f = service.submit(()->{
            TimeUnit.MILLISECONDS.sleep(500);
            return 1;
        });

        System.out.println(f.get());
        System.out.println(f.isDone());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@SokachWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值