gpt4 book ai didi

java - 为对象定义线程 ID 并中断

转载 作者:行者123 更新时间:2023-12-01 08:51:16 25 4
gpt4 key购买 nike

我在系统上有专用于用户的线程,并且我希望能够单独停止它们,我是否在创建时将线程的 ID 与用户数据一起存储,然后调用中断?或者我可以以某种方式将线程添加到我的用户对象中,然后像 myuser.mythread.interrupt(); 那样调用它,或者这是在祈求魔法吗?

目前我可以停止它们并重新启动,而无需我想要的线程。但这是一项耗时的任务,并且还会引发用户必须等待的延迟。

更新,这可以作为答案吗?

if(delete==true) {
if (Thread.currentThread().getId() == deleteId) {
Thread.currentThread().interrupt();
delete=false;
}
}

更新

我设法找到一种方法来使用 myuser.mythread.interrupt();或者有点..

我将线程作为子类添加到用户类中,并在用户类中创建了一个方法来启动和中断,现在我可以使用启动和停止线程

online.get(1).hellos();
online.get(1).hellosStop();

不必创建引用并跟踪用户对象以外的任何其他内容。

更新(关于接受的答案,使用 id 作为引用,我可以这样做)

public class MyRunnable implements Runnable {
private boolean runThread = true;
@Override
public void run() {
try {
while (runThread) {
if(delete==true) {
if (Thread.currentThread().getId() == deleteId) {
Thread.currentThread().interrupt();
delete=false;
}
}
Thread.sleep(5);
}
}
catch (InterruptedException e) {
// Interrupted, no need to check flag, just exit
return;
}
}
}

最佳答案

您可以只存储Thread引用,也许在WeakReference中,这样如果线程自行退出,它就会消失。

但是您也可以让线程时不时地检查 AtomicBoolean(或 volatile boolean 值)以查看它是否被中断,这样您就不需要对线程的引用。

请注意,如果没有要停止的线程的配合,则不可能停止 Java 中的线程。无论您使用 interrupt 还是它检查的 boolean 值都没有关系,在这两种情况下,都由线程来检查这些标志(interrupt 只是设置一个标志)然后执行一些操作,例如退出。

更新可中断线程类示例:

public class MyRunnable implements Runnable {
private final AtomicBoolean stopFlag;

public MyRunnable(AtomicBoolean stopFlag) {
this.stopFlag = stopFlag;
}

@Override
public void run() {
try { // Try/Catch only needed if you use locks/sleep etc.
while (!stopFlag.get()) {
// Do some work, but remember to check flag often!
}
}
catch (InterruptedException e) {
// Interrupted, no need to check flag, just exit
return;
}
}
}

关于java - 为对象定义线程 ID 并中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42390042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com