如何停止线程 - Java

时间:2014-03-26 08:54:18

标签: java multithreading

如果我有以下结构,有人可以告诉我如何停止线程吗?

我希望在线程 C 过期后停止 B 主题。

enter image description here

    c = new c();
    c.start();
    b = new b();
    b.start();

class c extends Thread {

    @Override
    public void run() {
      // DRAW IMAGE
      // b.stop(); - doenst work
    }
}

class b extends Thread {

    @Override
    public void run() {
      // PROGRESS BAR

    }
}

9 个答案:

答案 0 :(得分:5)

没有好办法立即停止线程。

  • Thread.stop(),但它很危险并已弃用。除非您彻底分析了您的代码并确定风险可以接受,否则不要使用它。

  • Thread.interrupt(),但无法保证线程会快速停止,甚至根本不会停止。

例如:

while (!Thread.interrupted()) {
    try {
        //do stuff
    } catch (InterruptedException e) {
        // end up
    }
}
  • 有一种方法是编写线程来定期检查一个标志,但是如果不经常检查标志(偶然或通过设计),则线程不会很快停止。

有关详细信息,请参阅this

答案 1 :(得分:2)

请勿使用.stop()使用interrupt()代替

你需要定期检查你的b线程是否被中断,如果被打断,你可以采取适当的行动 -

if(b.isInterrupted()){
  //end your work
}

---> http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

答案 2 :(得分:2)

不要使用Thread.stop()方法,它已被弃用,在这种情况下,您可以处理代码中b线程的停止。

例如:

class b extends Thread {
    private volatile boolean stopped = false;


    public void stop () {
        stopped = true;
    }

    @Override
    public void run() {
      // PROGRESS BAR
      while ( ! stopped ) {
         // paint the progress bar
      }

    }
}

答案 3 :(得分:1)

您可能需要查看this。您可以使用标记或只使用Thread.currentThread().interrupt(),您可以通过调用Thread.isInterrupted()来检查线程是否被中断。

答案 4 :(得分:1)

对此的解决方案得到了很好的解释here。任何可能需要关闭状态标志的线程都可以具有以下结构:

volatile boolean shutdownRequested;

...

public void shutdown() { shutdownRequested = true; }

public void doWork() { 
    while (!shutdownRequested) { 
        // do stuff
    }
}

因此,在您的情况下,您的B类看起来与上述类似。然后,在C类中,您可以调用B类的shutdown()方法。

答案 5 :(得分:0)

在您的调用代码中创建一个可锁定对象

Boolean canRun = true;
c = new c();

b完成后将canRun设置为false

定期检查canRun

c的值

答案 6 :(得分:0)

使用Boolean标记。

对于线程安全,请使用AtomicBoolean

AtomicBoolean running = new AtomicBoolean(Boolean.TRUE);

run()方法中,请在暂时条件下检查此标记:

public void run(){
    while(running){
    ...
    }
}

如果您想停止此Thread,请将running更改为false

答案 7 :(得分:0)

好吧,试试这个:

while(true) {
  if (!c.isAlive() && b.isAlive()){
      b.interrupt();
  }
}

答案 8 :(得分:0)

尝试类似

的内容
 private void startActionPerformed(java.awt.event.ActionEvent evt) {

 p=new Progress();
 myThread=new Thread(p);
 p.setLocationRelativeTo(null);
 p.setVisible(true);
 myThread.start();

}

private void stopActionPerformed(java.awt.event.ActionEvent evt) {

  if(myThread!=null){
  p.Terminate();
  try {
  myThread.join();
  } catch (InterruptedException ex) {
 Logger.getLogger(ClassA.class.getName()).log(Level.SEVERE, null, ex);
   }
   }

   }

/////////////////////////////////////////////// /////////////////

如何运作和停止!

    int i;
    volatile boolean running=true;
    public void run(){
          while(running){
      for(i=0;i<=100;i++){
    pro.setValue(i);
     try {
     Thread.sleep(200);
     } catch (InterruptedException ex) {
     Logger.getLogger(Progress.class.getName()).log(Level.SEVERE, null, ex);
    return;
    }
   if(i==100){
     Terminate();
    break;
    }
   }
 }

}

public void Terminate(){ 运行= FALSE; }

/////////////////////////////////////////////// //////////////////////