停止线程随时随地我想

我有一个方法,至极应该中断一个线程,但它不是。 我需要经常检查的方法,同时停止线程中断线程? 我怎么能只是随时终止线程?

solverTh = new Thread(new Runnable() { @Override public void run() { while(somethingistrue){ //do lot of stuff here for long time } } }); solverTh.start(); } public void terminate(){ if(solverTh != null){ solverTh.interrupt(); } }

还好,比我想到了“很多东西”是无关紧要的,但我将发布比。 它使openGL的操作,我添加了布尔变量“终止”,以现在的工作的代码,我只是想找到一个更好的解决方案:(GLC是GLCanvas中,而rotmultiplecube方法旋转3个对象)反正我已经解决了这个问题现在,感谢您的答案。

terminated = false; try { Thread.sleep(2000); } catch (InterruptedException ex) { Logger.getLogger(BruteForce.class.getName()).log(Level.SEVERE, null, ex); } int colorToBeSolved = Statics.RED_BLUE_TABLE[stateToBeSolved]; System.out.println(stateToBeSolved + "," + colorToBeSolved); if(entities[0].getColor() != colorToBeSolved){ if(terminated) return; fullRotate(Statics.FIRST_ROW, Statics.DOWN); } if(entities[1].getColor() != colorToBeSolved){ if(terminated) return; fullRotate(Statics.SECOND_COL, Statics.RIGHT); } if(entities[2].getColor() != colorToBeSolved){ if(terminated) return; fullRotate(Statics.THIRD_COL, Statics.RIGHT); } if(entities[3].getColor() != colorToBeSolved){ if(terminated) return; fullRotate(Statics.SECOND_ROW, Statics.DOWN); } if(entities[6].getColor() != colorToBeSolved){ if(terminated) return; fullRotate(Statics.THIDR_ROW, Statics.DOWN); } for(int i = 0; i < 9; ++i){ int col = i % 3; int row = 3 + i/3; while(entities[i].getState() != stateToBeSolved){ for(int j = 0;j < 2; ++j){ if(entities[i].getState() != stateToBeSolved){ if(terminated) return; fullRotate(col, Statics.LEFT); if(terminated) return; fullRotate(row, Statics.UP); if(terminated) return; fullRotate(col, Statics.RIGHT); if(terminated) return; fullRotate(row, Statics.DOWN); } } for(int j = 0;j < 2; ++j){ if(entities[i].getState() != stateToBeSolved){ if(terminated) return; fullRotate(col, Statics.RIGHT); if(terminated) return; fullRotate(row, Statics.UP); if(terminated) return; fullRotate(col, Statics.LEFT); if(terminated) return; fullRotate(row, Statics.DOWN); } } } } }

和fullrotate方法:

private void fullRotate(int selectionIndex, int direction){ for(int i = 0; i < 9; ++i){ glc.rotMultipleCubeSlow(selectionIndex, direction); try { Thread.sleep(20); } catch (InterruptedException ex) { terminate(); } } glc.setMovesText(selectionIndex, direction); glc.setMultipleStateAndColorsByTable(selectionIndex, direction); glc.isEntitiesRight(); }

--------------解决方案-------------

优雅的解决办法是修改你的fullRotate()方法抛出InterruptedException。

private void fullRotate(int selectionIndex, int direction)
throws InterruptedException{
for(int i = 0; i < 9; ++i){
glc.rotMultipleCubeSlow(selectionIndex, direction);
Thread.yield();
}
glc.setMovesText(selectionIndex, direction);
glc.setMultipleStateAndColorsByTable(selectionIndex, direction);
glc.isEntitiesRight();
}

  • 当你调用了Thread.interrupt(),你会InterruptedException的任一项时,抛出它的方法被调用时,你的情况Thread.sleep()方法或Thread.yield()。 这意味着,最好的方法是用它来实际中断的计算。
  • 你还需要检查Thread.currentThread()。isInterrupted()如果你想你了Thread.interrupt立即响应()
  • 您可以醚清除如果(终止)回报; 或Thread.currentThread()代替它。isInterrupted()查询。 拆除将被罚款,因为从fullRotate(Thread.sleep代码(20)/Thread.yield())将抛​​出InterruptedException异常。 另外代码将没有这些,如果(终止)所有的地方清洁。
  • 使用Thread.yield()代替用于视频下载(20)。 显然,你不想睡觉,因为你把20米利斯。 20 milis是非常接近的上下文切换时间量子。 该线程将醚多睡,或更少。 你不希望它睡得更没有任何理由,因此用收益率()。

你线程的run()就变成了:

solverTh = new Thread(new Runnable() {
@Override
public void run() {
while(somethingistrue &&
!Thread.currentThread().isInterrupted()) {
try {
//do lot of stuff here for long time
} catch (InterruptedException ex) {
// handle stop processing
}
}
}
});
solverTh.start();

也需要从下面取出尝试捕捉:

try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
Logger.getLogger(BruteForce.class.getName()).log(Level.SEVERE, null, ex);
}

while(somethingistrue !Thread.currentThread().isInterrupted()){
//do lot of stuff here for long time
}

不必为阻塞IO工作。 使用下三滥的手段:覆盖了Thread.interrupt()接近IO对象,导致IOException异常,如果处理不当,结束线程的run方法。

中断线程的唯一方法是让它退出本身。 Strightforward中断甚至没有用Java实现的,因为死锁的可能性。 所以,你的线程代码必须是这样的:

solverTh = new Thread(new Runnable() {
@Override
public void run() {
while(somethingistrue)
// Do a little stuff here
}
}
});
solverTh.start();

somethingistrue是一种用于线程中断信号。

当一个线程在运行(消耗CPU周期),那么就不会在默认情况下(自动)回应Thread.interrupt() 您必须编写代码来显式地做到这一点。

分手//do lot of stuff here for long time为2个或多个步骤,而这些步骤检查之间插入了Thread.currentThread().isInterrupted() -如果为true -打破,否则继续。 这只是为了实现你想要的安全的方式。

这取决于长时间运行的东西是什么,你就要来设计的步骤,并决定它最好的时候,检查中断和突破。

能够可靠地阻止从另一线程的执行的唯一事情是操作系统。 所以,不会有太多的选择:

1)信号线程停止本身。 该方案有点儿取决于什么线程正在做什么。 如果它在另一个处理器上运行,或停留在一个阻塞调用你不能解锁,(注意,许多阻塞调用可以说服提前返回),有可能出现问题。

什么是“很多东西”做什么?

2)使用操作系统调用来终止线程​​。 这可以是一个可行的选择,这取决于螺纹做什么。 如果终止线程,同时它拥有的重要资源公共锁定的可能性,(例如,它在一个malloc()函数的中间,有内存管理器锁定),那么你就可以陷入困境。 你必须确定哪些线程正在做安全地终止它以这种方式。

3)使用一个单独的进程来运行“东西”。 这显然​​工作确定,但通常涉及缓慢和痛苦的进程间通讯科来传递数据,并返回结果。

4)设计的应用程序,使得它不需要终止线程。 有些应用程序从来不需要终止任何线程除非是在应用程序关闭,所以没有问题 - 操作系统可以阻止任何东西。 在应用程序运行过程中一个线程必须“停止”和正在运行一个漫长的CPU密集型操作,或者被阻塞了很久,可能不确定的时期,它的优先级设置为最小/怠速,只是'成为孤儿'一个线程的情况下,离开它最终消亡是另一种常见的做法。

是最差的情况是跑了很多东西长时间使用内存管理器或其他公共锁,可能在库中,你不知道到底是什么它做一个线程,不能挂接和读/写在这样一种方式,“成为孤儿”它关闭数据意味着另一个线程不能启动,以使用该数据。 你真的stuft,然后你可能要终止应用程序,然后重新启动。 这只是最好避免设计中一个线程可以进入这样的状态:)

5)忘了 - 如果线程使用的数据你可以得到的,设置东西NULL,0,MAXINT或一些其他类似bodge可能会导致一个例外,在运行长了东西线得到提升。 当执行泡出的长东西,线程可以在异常处理程序和退出检查中断状态,如果设置。

分类:java的 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.641 (s). 10 q(s)