ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一个线程池同时执行多个线程

2022-02-28 15:35:22  阅读:177  来源: 互联网

标签:10 CyclicBarrier 多个 队列 线程 new 执行 ThreadPoolExecutor


一.CountdownLatch和CyclicBarrier的区别'

CountdownLatch和CyclicBarrier都属于线程同步的工具。

CyclicBarrier对象时传入了一个方法,当调用CyclicBarrier的await方法后,当前线程会被阻塞等到所有线程都调用了await方法后 调用传入CyclicBarrier的方法,然后让所有的被阻塞的线程一起运行

CountdownLatch可以当做一个计数器来使用,比如某线程需要等待其他几个线程都执行过某个时间节点后才能继续执行
countDown方法使计数器-1

1,CountdownLatch适用于所有线程通过某一点后通知方法,而CyclicBarrier则适合让所有线程在同一点同时执行

2,CountdownLatch利用继承AQS的共享锁来进行线程的通知,利用CAS来进行--,而CyclicBarrier则利用ReentrantLock的Condition来阻塞和通知线程

二.ThreadPoolExecutor的参数:

corePoolSize:指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;

maximumPoolSize:指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;

keepAliveTime:当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁;

unit:keepAliveTime的单位

workQueue:任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;

threadFactory:线程工厂,用于创建线程,一般用默认即可;

handler:拒绝策略;当任务太多来不及处理时,如何拒绝任务;

三.ThreadPoolExecutor的两个常用执行方法

无返回值异步调用:execute()方法,底层使用Runnable的run()
有返回值异步调用:submit()方法,底层使用Callable的call(),可以提供Future < T > 类型的返回值。 

package com.lagou;

import javax.sound.midi.Soundbank;
import java.util.concurrent.*;

public class Test {
    public static void main(String args[]) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
        ThreadPoolExecutor threadPoolExecutor =  new ThreadPoolExecutor(10,10,1, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>(100));
        for (int i = 1;i < 11 ; i++) {
            threadPoolExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        cyclicBarrier.await();
                        System.out.println(Thread.currentThread()+":"+System.currentTimeMillis());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        threadPoolExecutor.shutdown();
        System.out.println("======================");
        CountDownLatch countDownLatch = new CountDownLatch(10);
        ThreadPoolExecutor threadPoolExecutor1 =  new ThreadPoolExecutor(10,10,1, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(100));
        for (int i = 1;i < 11 ; i++) {
            threadPoolExecutor1.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println(Thread.currentThread()+":"+System.currentTimeMillis());
                    } finally {
                        countDownLatch.countDown();
                    }
                }
            });
        }
        //关闭线程处理
        try {
            countDownLatch.await();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //关闭线程池
        threadPoolExecutor1.shutdown();
    }

}

  

标签:10,CyclicBarrier,多个,队列,线程,new,执行,ThreadPoolExecutor
来源: https://www.cnblogs.com/qtfwax/p/15945766.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有