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

一.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();
    }

}

  

上一篇:谷粒学苑项目第一天-配置Swagger2进行接口测试


下一篇:sqlserver 统计数据库每个数据表的条数