专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 详解4个线程工具类

详解4个线程工具类

更新时间:2021-02-04 17:55:49 来源:动力节点 浏览1038次

在Java中,工具类定义了一组公共方法,用来实现对各种实用工具的调用。同样的,在Java多线程中,也存在着一些线程工具类来实现一些线程的相关操作。本文为大家介绍常用的4个线程工具类

1. ThreadlLocal

ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

2. Semaphore

Semaphore ,是一种新的同步类,它是一个计数信号。一般来说,需要同步的代码块,一次只能一个线程执行,读写锁的话,只能多个读线程同时执行。使用信号量,可以让指定线程数量,同时访问同一个资源。比方说,5个售票窗,100个人买票,那么同一时间,最多也就只能卖出5张票,信号量就是售票窗,如果只有一个售票窗,那么可以理解为这个售票窗就是锁,只有前面的人买完了,后面的人才可以买票。使用示例代码: 

// 线程池

        ExecutorService exec = Executors.newCachedThreadPool();

        // 只能5个线程同时访问

        final Semaphore semp = new Semaphore(5);

        // 模拟20个客户端访问

        for (int index = 0; index < 50; index++) {

            final int NO = index;

            Runnable run = new Runnable() {

                public void run() {

                    try {

                        // 获取许可

                        semp.acquire();

                        System.out.println("Accessing: " + NO);

                        Thread.sleep((long) (Math.random() * 6000));

                        // 访问完后,释放

                        semp.release();

                        //availablePermits()指的是当前信号灯库中有多少个可以被使用

                        System.out.println("-----------------" + semp.availablePermits());

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

            };

            exec.execute(run);

        }

        // 退出线程池

        exec.shutdown();

3.CountDownLatch

可以理解成是一个栅栏,需要等所有的线程都执行完成后,才能继续往下走。

CountDownLatch 默认的构造方法是 CountDownLatch(int count) ,其参数表示需要减少的计数,主线程调用 #await() 方法告诉 CountDownLatch 阻塞等待指定数量的计数被减少,然后其它线程调用 CountDownLatch 的 #countDown() 方法,减小计数(不会阻塞)。等待计数被减少到零,主线程结束阻塞等待,继续往下执行。

4.CyclicBarrier

CyclicBarrier 与 CountDownLatch 有点相似, 都是让线程都到达某个点,才能继续往下走, 有所不同的是 CyclicBarrier 是可以多次使用的。  示例代码:
     

   CyclicBarrier barrier;

        

        public TaskThread(CyclicBarrier barrier) {

            this.barrier = barrier;

        }

        

        @Override

        public void run() {

            try {

                Thread.sleep(1000);

                System.out.println(getName() + " 到达栅栏 A");

                barrier.await();

                System.out.println(getName() + " 冲破栅栏 A");

                

                Thread.sleep(2000);

                System.out.println(getName() + " 到达栅栏 B");

                barrier.await();

                System.out.println(getName() + " 冲破栅栏 B");

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

以上就是Java多线程中常见的4个线程工具类,我们在学习和使用Java多线程时,多多少少都会用到它们。在Java多线程中还有很多的类,每一个都不是一两句话能够讲清楚的,想学习的小伙伴可以前去本站的Java多线程教程学习。

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>