【发布时间】:2021-07-30 22:19:34
【问题描述】:
我有一堆有点随意产生的线程。当他们互相比赛时,只有最后产生的那个才是相关的。其他线程可以被丢弃或停止。但我不知道该怎么做,所以我实现了一个非常基本的计数器来检查线程是否是最新生成的线程。
编辑:我希望能够杀死花费太长时间的线程(因为它们不再需要);可能不是来自线程本身,因为它们正忙于做其他事情。
这个代码似乎有效。但是感觉不是很健壮。有人可以给我一个提示吗?
class Main {
private static volatile int latestThread = 0;
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
spawnThread();
}
}
private static void spawnThread() {
latestThread++;
int thisThread = latestThread;
new Thread(() -> {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (latestThread == thisThread) {
// only the latest "active" thread is relevant
System.out.println("I am the latest thread! " + thisThread);
}
}).start();
}
}
输出:
I am the latest thread! 10
【问题讨论】:
-
如果其中只有一个是相关的,为什么还要启动所有这些线程?尤其是对于这类问题——你正在寻找“正确”的方式来做某事——提供足够的信息让我们能够理解你真正想要做什么是很重要的,因为这将有助于确定“正确”的做法是什么。
-
这不是线程安全的,除非您在 latestThread 变量上添加 volatile 关键字。
-
顺便说一句,不能保证
if (latestThread == thisThread)行实际上会看到latestThread的当前值,因为latestThread将由不同的线程设置,不会发生-在大多数情况下,在关系之前。所以理论上有可能一个线程认为它是最新的线程,即使它真的不是。 -
@vakio:与其每次用户交互时都生成一个新线程,不如将任务提交给 ThreadPoolExecutor 更合适?
-
首先,将对新线程的引用保存到 AtomicReference 或 ConcurrentHashMap 以便在必要的检查后中断它。
标签: java multithreading threadpool