CountDownLatch介绍
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。 这个时候就可以使用CountDownLatch。
本文主要介绍CountDownLatch的一个具体使用——字符串敏感字过滤。字符串敏感字过滤是一个常用的功能点,这里使用的敏感字过滤方法主要参考
敏感词过滤算法实现这边博客。而使用CountDownLatch的主要目的是为了提高敏感字过滤的效率。
//将字符串按照每1024个字符一组进行截取
private static final int PRE_LENGTH = 1024;
public String filter(String textStr) {
int length = textStr.length();
int latchCount = length / PRE_LENGTH + 1;
String[] temp = new String[latchCount];
Worker[] workerGroup = new Worker[latchCount];
for (int i = 0; i < latchCount; i++) {
if (i + 1 == latchCount) {
// 最后一次
temp[i] = textStr.substring(i * PRE_LENGTH);
} else {
temp[i] = textStr.substring(i * PRE_LENGTH, (i + 1) * PRE_LENGTH);
}
}
StringBuilder builder = new StringBuilder(length);
CountDownLatch latch = new CountDownLatch(latchCount);
for (int i = 0; i < latchCount; i++) {
workerGroup[i] = new Worker(temp[i], sw, latch);
workerGroup[i].start();
}
try {
latch.await();
for (Worker tempWorker : workerGroup) {
builder.append(tempWorker.textStr);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return builder.toString();
}
static class Worker extends Thread {
String textStr;
String replaceStr;
KWSeeker kwseeker;
CountDownLatch latch;
public Worker(String textStr, KWSeeker kwseeker, CountDownLatch latch) {
this.textStr = textStr;
this.kwseeker = kwseeker;
this.latch = latch;
}
public void run() {
try {
textStr = doWork();
} catch (Exception e) {
e.printStackTrace();
} finally {
latch.countDown();
}
}
private String doWork() {
String str = kwseeker.replace(textStr, fragment);
return str;
}
}
我们可以看到:
1、CountDownLatch初始化的count为字符串按照每1024个字节截取的数组数量 latchCount
2、创建 latchCount 个线程,并执行
3、只有当所有线程执行完成,并调用 latch.countDown()后 latch.await()会被唤起,继续执行后续的代码。
测试代码
protected List<Keyword> init() {
List<Keyword> words = new ArrayList<>();
try {
for (String line : TextLineIO
.lineSeq("D:\\keyword.txt")) {
words.add(new Keyword(line));
}
} catch (Throwable e) {
e.printStackTrace();
}
return words;
}
public static void main(String[] args) throws IOException {
Testkeyword t = new Testkeyword();
t.init();
String path="D:\\word.txt";
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
StringBuffer buffer = new StringBuffer();
String line = " ";
while ((line = reader.readLine()) != null){
buffer.append(line);
}
String textStr=buffer.toString();
System.out.println("过滤字符串长度:"+textStr.length());
long begin=System.currentTimeMillis();
t.filter(textStr);
System.out.println("消耗时间:"+(System.currentTimeMillis()-begin)+"ms");
}
测试结果:
--------未使用多线程-----------
过滤字符串长度:31878
消耗时间:215ms
-------使用多线程--------------
过滤字符串长度:31878
消耗时间:47ms
分享到:
相关推荐
本文将详细介绍如何利用MyBatis结合多线程和CountDownLatch闭锁来实现数据的批量插入。 首先,我们来看`mybatis批处理`。MyBatis的批处理功能允许我们在一次数据库连接中执行多条SQL语句,从而减少了数据库连接的...
下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。 什么时候用CountDownLatch? 在多线程编程中,我们经常会遇到这样一种情况:某个线程需要等待其他线程执行完毕后再继续执行。例如,在上面的代码中,...
Java 使用 CountDownLatch 等待多线程全部执行完成 CountDownLatch 是 Java 中的一个同步工具类,允许一个或多个线程等待其他线程完成操作。它的应用场景非常广泛,例如在处理大量数据时,可以使用多线程的方式处理...
在多线程编程中,确保一组操作按照特定的顺序或者所有操作都完成后再进行下一步是常见的需求。Java 提供了多种工具来实现这样的同步机制,其中之一便是 `CountDownLatch` 类。`CountDownLatch` 是一个计数器,可以...
"CountDownLatch" 和 "Thread" 是Java编程语言中实现多线程并行执行的关键工具,它们有助于提高程序的运行效率和响应速度。 **多线程并行执行** 多线程并行执行是指在同一个程序中同时运行多个线程,每个线程负责...
1. **多线程基础**:论文可能会首先介绍多线程的基本概念,解释为什么在JAVA中需要使用多线程,以及多线程如何提升程序的执行效率。这部分内容可能会涉及到线程的创建、启动、同步和通信等基础知识。 2. **JAVA多...
如何使用CountDownLatch同步java多线程 CountDownLatch 是 Java 并发编程中的一种常用工具,用于控制多个线程的并发执行。它可以实现多个线程之间的同步操作,使得线程之间可以协调工作,避免了线程之间的互相干扰...
书中详细介绍了Java多线程的核心概念,如线程的创建、启动、同步、协作以及生命周期管理。读者将学习如何通过实现Runnable接口或继承Thread类来创建线程,以及如何使用Executor框架来管理线程池。 此外,书中还深入...
Java中的CountDownLatch是一种多线程同步工具类,它允许一个或多个线程等待其他线程完成操作。在Java多线程编程中,CountDownLatch扮演着“共享锁”的角色,类似于读写锁中的ReadLock,其核心功能是通过一个计数器来...
在多线程环境中,多个线程可能同时执行该方法,因此要特别注意线程安全问题。避免修改共享数据时产生竞态条件,可以使用synchronized关键字进行同步控制,或者使用java.util.concurrent包下的线程安全数据结构。 4....
在多线程环境中,线程间通信和同步是非常重要的,Java提供了多种机制,如`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`Lock`和`Condition`接口,用于控制线程的执行顺序和资源访问。...
- **CountDownLatch**:常用于多线程间的同步,计数器从正整数开始,每当一个线程完成任务,计数器减一,当计数器为零时,所有等待的线程将被释放。 - **CyclicBarrier**:允许一组线程等待彼此到达某个屏障点,...
9. **并发工具类**:`CountDownLatch`、`CyclicBarrier`和`Semaphore`等并发工具类可以帮助控制线程的启动和同步,提高多线程操作的协调性。 10. **安全性**:在多线程环境下,文件操作需注意文件锁,避免同一时刻...
- **CountDownLatch**:允许一个线程等待其他线程完成操作,常用于多线程并发测试。 - **CyclicBarrier**:允许多个线程等待直到达到某个屏障点再一起继续执行。 - **Semaphore**:信号量,控制同时访问特定资源...
为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
- Java通过`Thread`类和`Runnable`接口支持多线程编程,提供了一种在单个进程中并发执行多个任务的方法。 2. **线程实现** - 创建线程有两种主要方式:继承`Thread`类并重写`run()`方法,或实现`Runnable`接口并...
线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...