在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多线程教程学习。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习