1

我正在尝试的代码

public void killJob(String thread_id)throws RemoteException{   
Thread t1 = new Thread(a);   
    t1.suspend();   
}

我们如何根据它的 id 挂起/暂停线程?Thread.suspend 已被弃用,必须有一些替代方案来实现这一点。我有线程 ID,我想挂起并终止线程。

编辑:我用过这个。

AcQueryExecutor a=new AcQueryExecutor(thread_id_id);
Thread t1 = new Thread(a); 
t1.interrupt(); 
while (t1.isInterrupted()) { 
    try { 
       Thread.sleep(1000); 
    } catch (InterruptedException e) { 
       t1.interrupt(); 
       return; 
    } 
} 

但我无法停止这个线程。

4

2 回答 2

8

我们如何根据它的 id 挂起/暂停线程?...我有线程 ID,我想挂起并终止线程。

这些天杀死线程的正确方法是interrupt()它。这会将 设置Thread.isInterrupted()为 true 并导致wait(),sleep()和其他几个抛出的方法InterruptedException

在您的线程代码中,您应该执行以下操作,以确保它没有被中断。

 // run our thread while we have not been interrupted
 while (!Thread.currentThread().isInterrupted()) {
     // do your thread processing code ...
 }

下面是一个如何处理线程内部中断异常的示例:

 try {
     Thread.sleep(...);
 } catch (InterruptedException e) {
     // always good practice because throwing the exception clears the flag
     Thread.currentThread().interrupt();
     // most likely we should stop the thread if we are interrupted
     return;
 }

暂停线程的正确方法有点困难。volatile boolean suspended您可以为它会关注的线程设置某种标志。您还可以使用object.wait()挂起线程,然后object.notify()重新启动它运行。

于 2012-06-13T17:18:45.300 回答
0

我最近发布了一个在内部使用的PauseableThread实现ReadWriteLock。使用其中一个或变体,您应该能够暂停线程。

至于通过 id 暂停它们,一点谷歌搜索建议了一种迭代所有看起来应该工作的线程的方法。Thread已经暴露了一段时间的getId方法。

杀死线程是不同的。@Gray已经巧妙地覆盖了那个。

于 2012-06-14T14:50:48.867 回答