2009-10-23 106 views
2

我用GUI做了一个java程序,我想要一个停止按钮功能,当用户点击停止按钮时,程序必须停止。如何在Java中停止线程?

  1. 在我的计划中,主线程启动其他10个线程,我想,只要停止按钮被点击的所有10个线程必须在主线程之前停止。

  2. 其次,我也想,只要这10个线程的任何线程停止时,必须先关闭它打开之前一样连接到数据库的所有资源等

我已经实现了代码为........

现在有一个问题。

我的Thread类是这样的:

public class ParserThread implements Runnable { 
    private volatile boolean stopped = false; 

    public void stopTheThread() { 
     stopped = true; 
    } 
    : 
    : 
} 

而下面是从功能的start()

public class Main() { 
    Thread [] threads; 

    public void start() { 
     for(int i = 0; i < 10; i++) { 
      threads[i] = new Thread(new ParserThread()); 
     }  
    } 

    public void stop() { 
     // code to stop all the threads 
    } 
} 

现在,我要打电话的停止方法启动10个线程的主线程ParserThread设置“stopped = true”来停止线程。我希望为所有10个线程完成这件事。

我该如何调用停止方法。我希望它在Main类的stopAllThreads()方法中完成。

+0

见http://stackoverflow.com/questions/1611822/how-to-join-one-thread-with-other-in-java对这个问题进行的详细信息。 – 2009-10-23 07:31:18

+0

您需要跟踪ParserThread对象而不是线程,基本上 - 或者两者兼而有之。只需要一个ParserThreads数组。 – 2009-10-23 13:31:56

+0

的[你如何杀死在Java中的线程?]可能的复制(http://stackoverflow.com/questions/671049/how-do-you-kill-a-thread-in-java) – Raedwald 2016-09-04 08:30:50

回答

8

一般来说,这样做的方法是让每个其他线程定期检查一个标志。经常后台线程循环,等待工作 - 他们每次绕着一个循环都必须检查标志。如果他们使用Object.wait()或类似的东西被告知有更多的工作,则应该使用相同的通知来指示线程也应该停止。 (不要只是旋转,直到你停下来 - 这将吸CPU,不要只使用睡眠 - 这将延迟终止。)

这使得所有的线程干净地终止,适当释放资源。其他选项如interrupt()和不赞成使用的destroy()方法难以正确控制IMO。 (中断一个线程比强制中止要好,但它有自己的问题 - 例如中断只能在某些点处理。)

编辑:在代码中,它看起来像这样:

然后
// Client code 
for (Task task : tasks) { 
    task.stop(); 
} 

// Threading code 
public abstract class Task implements Runnable { 

    private volatile boolean stopped = false; 

    public void stop() { 
    stopped = true; 
    } 

    protected boolean shouldStop() { 
    return stopped; 
    } 

    public abstract void run(); 
} 

你的任务将继承Task。如果您想要stop()方法也可以通知监视器,则需要稍微复杂一点,但这是基本思路。

样的任务:

public class SomeTask extends Task { 
    public void run() { 
    while (!shouldStop()) { 
     // Do work 
    } 
    } 
} 
+0

能否请您解释一下在语法上。我怎样才能在我的程序中实现它。您可以在http://stackoverflow.com/questions/1611822/how-to-join-one-thread-with-other-in-java – 2009-10-23 07:35:01

+1

“定期检查标志”看看我的程序的一部分,也称为“主动等待”而不是推荐。使用等待/通知来避免这种情况。 – pimpf0r 2009-10-23 07:40:44

+1

@ pimpf0r:您只需要使用等待/通知,如果你转动或睡觉。如果你有一个持续不断的工作流,那很好。请注意,我已经提到如果你想要睡觉,在回答中使用wait()。 – 2009-10-23 07:44:14

-1

有具有标志线是否应该停止或不是一个控制器对象,每个线程周期性和出口检查控制器如果点击停止按钮(例如,如果您正在传送一个文件,然后每个块收到/发送后,检查是否停止点击)。

+1

迟到,几乎与以前的答案相同。 – 2012-01-26 08:37:09

0

我不认为答案可以解决问题。这里的代码:

public class SomeTask extends Task { 
    public void run() { 
     while (!shouldStop()) { 
     // Do work 
     } 
    } 
    } 

但如何处理,如果“做工作”挂,不回来吗?在这种情况下,虽然不能检查标志。线程仍然无法停止。

的可能的解决方案,这可能是使用工艺。