我正在编写一个包含5个线程的应用程序,它们可以同时从Web获取一些信息,并在缓冲类中填充5个不同的字段.
当所有线程完成工作时,我需要验证缓冲区数据并将其存储在数据库中.
我该怎么做(当所有线程完成工作时收到警报)?
我无法使用shutdown(),awaitTermination()因为有可能在等待时将新任务添加到ThreadPoolExecutor中.
所以我正在寻找一种方法,等待ThreadPoolExecutor清空它的队列并完成所有任务而不停止在该点之前添加新任务.
如果它有任何区别,这适用于Android.
谢谢
更新:几周后重新访问后,我发现在这种情况下修改后的CountDownLatch对我来说效果更好.我会保留答案标记,因为它更适用于我的要求.
在程序执行过程中,会启动许多线程.线程数量取决于用户定义的设置,但它们都使用不同的变量执行相同的方法.
在某些情况下,执行中需要清理,其中一部分是停止所有线程,我不希望它们立即停止,我只是设置一个他们检查的变量来终止它们.问题是它可以在线程停止前最多1/2秒.但是,我需要确保在清理可以继续之前所有线程都已停止.清理是从另一个线程执行的,所以从技术上讲,我需要这个线程来等待其他线程完成.
我想到了几种方法,但它们似乎都过于复杂.我希望有一些方法可以等待一组线程完成.有这样的事吗?
谢谢.
Golang有一种叫做a的东西WaitGroup,类似于Java中的a CompletionService或a CountDownLatch或a Semaphore或后者的某种组合。
我不完全确定如何在Java中实现WaitGroup。我可以想象一个带有某种Poison消息的自定义CompletionService将成为要走的路(因为队列不能说何时完成),但是也许有更好的并发数据结构/锁?
编辑我在下面发布了一个可能的解决方案Semaphore,我认为它比使用更加类似thread.join。
我想测量完整的执行时间(当所有线程都完成时)。但是我的代码在这里行不通,因为当主方法结束时,其他线程仍在运行,因为它们要比主方法花费更长的时间。
class Hello extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Hello");
try {
Thread.sleep(500);
} catch (final Exception e) {
}
}
}
}
class Hi extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Hi");
try {
Thread.sleep(500);
} catch (final Exception e) {
}
}
}
}
public class MultiThread {
public static void main(String[] args) {
final …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的场景。以下方法尝试访问锁,等待 1 秒并最终释放锁。
private final Lock lock = new ReentrantLock();
public void lockAndWait() {
logger.info("I {} am here", Thread.currentThread().getName());
lock.lock();
try {
logger.info("I {} got the lock", Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} finally {
lock.unlock();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在运行以下测试:
@Test
public void lockTest() {
for (int i = 0; i < 10; i++) {
new Thread(() -> lockAndWait()).start();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下日志输出:
12-10-2023 17:11:04 [Thread-2 ] INFO I Thread-2 am here
12-10-2023 17:11:04 …Run Code Online (Sandbox Code Playgroud)