线程池了解-Executors工具类

什么是线程池

在这里插入图片描述

如何创建线程池

在这里插入图片描述
在这里插入图片描述

    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 8,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(4),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

    }

在这里插入图片描述

线程池处理Runnable任务

在这里插入图片描述

MyRunnable.java

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() +"---输出666");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class ThreadPoolTest1 {
    public static void main(String[] args) {
        //1.通过ThreadPoolExecutor创建一个线程池对象
        ExecutorService pool = new ThreadPoolExecutor(3, 5, 8,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(4),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

        Runnable target = new MyRunnable();

        pool.execute(target);//线程池会自动创建一个新线程,自动处理这个任务,自动执行!
        pool.execute(target);//线程池会自动创建一个新线程,自动处理这个任务,自动执行!
        pool.execute(target);//线程池会自动创建一个新线程,自动处理这个任务,自动执行!
        pool.execute(target);//复用前面的核心线程
        pool.execute(target);//复用前面的核心线程

    }
}

输出结果:

pool-1-thread-3—输出666
pool-1-thread-2—输出666
pool-1-thread-1—输出666
pool-1-thread-1—输出666
pool-1-thread-2—输出666

临时线程的创建时机

核心线程在忙,任务队列占满了,然后再出现新任务的时候,就会创建临时线程
将代码修改,睡眠时间加长。

        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        pool.execute(target);//线程池会自动创建一个新线程,自动处理这个任务,自动执行!
        pool.execute(target);//线程池会自动创建一个新线程,自动处理这个任务,自动执行!
        pool.execute(target);//线程池会自动创建一个新线程,自动处理这个任务,自动执行!
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        //到了临时线程的创建时机
        pool.execute(target);
        pool.execute(target);

输出结果:

pool-1-thread-2—输出666
pool-1-thread-3—输出666
pool-1-thread-1—输出666
pool-1-thread-5—输出666
pool-1-thread-4—输出666
在这里插入图片描述

线程池处理Callable任务

在这里插入图片描述

public class ThreadPoolTest2 {
    public static void main(String[] args) throws Exception {
        //1.通过ThreadPoolExecutor创建一个线程池对象
        ExecutorService pool = new ThreadPoolExecutor(3, 5, 8,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(4),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

        //2.使用线程处理Callable任务
        Future<String> f1 = pool.submit(new MyCallable(100));
        Future<String> f2 = pool.submit(new MyCallable(200));
        Future<String> f3 = pool.submit(new MyCallable(300));
        Future<String> f4 = pool.submit(new MyCallable(400));

        System.out.println(f1.get());
        System.out.println(f2.get());
        System.out.println(f3.get());
        System.out.println(f4.get());

    }

MyCallable.java

public class MyCallable implements Callable<String> {
    private int n;

    public MyCallable(int n) {
        this.n = n;
    }
    //2.重写call方法
    @Override
    public String call() throws Exception {
        int sum = 0;
        for (int i = 1; i < n; i++) {
            sum+=i;
        }

        return Thread.currentThread().getName()+"求出了1-" + n +"的和是:" +sum;
    }
}

输出结果:

pool-1-thread-1求出了1-100的和是:4950
pool-1-thread-2求出了1-200的和是:19900
pool-1-thread-3求出了1-300的和是:44850
pool-1-thread-3求出了1-400的和是:79800

Executors工具类

在这里插入图片描述

        ExecutorService pool1 = Executors.newFixedThreadPool(3);
      ExecutorService pool2 = Executors.newSingleThreadExecutor();
  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值