如果我有以下结构,有人可以告诉我如何停止线程吗?
我希望在线程 C 过期后停止 B 主题。
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
}
}
答案 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; }
/////////////////////////////////////////////// //////////////////////