我目前正在从一个服务运行一个线程来做一些后台工作。现在存在线程崩溃或者我想从服务中断线程的可能性。那我该怎么:
到目前为止,我所做的工作如下:
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
doMyBackgroundWork();
sleep();
}
}catch(Exception e){
ExceptionHandler.logAndSendException(e);
Thread.currentThread().interrupt();
if(crashedListener != null){
crashedListener.onThreadCrashed();
}
}
LOG.i("Thread stops now.");
}
private void sleep() {
try {
sleep(frequency);
} catch (InterruptedException e) {
//what to do here? it can happen because I stopped it myself
}
}
所以一开始我运行我的线程直到它被中断。如果出现任何异常,我想启动一个新线程,因此我的服务实现了一个侦听器接口,一旦抛出异常,我就调用它。我知道不鼓励捕获所有内容,但我需要知道线程是否停止,而不需要一直轮询Thread.isAlive()。
除了我上面的四个问题之外:
谢谢!
您实际上并没有中断您自己的线程,因为catch
块在while循环之外。因此,任何异常都将立即停止执行。
中断本质上只是一个请求(通常来自另一个线程),要求停止做你正在做的事情。线程可以自由地忽略它,并继续做它正在做的事情。通常情况下,您必须抛出一个异常来响应中断,或者以其他方式停止执行,例如从循环中中断(您需要在//what to do here?
注释中这样做)。有些库方法是“响应中断”的,这意味着如果线程被中断,它们会抛出异常,例如thread.sleep()
,您很可能在sleep
调用中使用它。
我推荐在实践中选择Java并发。在优秀的并发材料中,有一章是关于中断的,非常有帮助。
编辑:我会删除你中断自己线程的代码。您还需要将InterruptedException作为运行时异常重新抛出,以脱离执行循环。通常,人们会创建一个扩展RuntimeException的新异常,类似于MyInterruptedException。然后,您可以将它添加到循环周围的catch块中,这样您就可以知道线程何时中断,何时执行失败。
作为一个通用示例,您可以执行如下操作:
public void run() {
try {
while (true) {
// check for interrupts in the loop, or somewhere in the work method
if (Thread.interrupted()) {
throw new MyInterruptedException("Important thread interrupted.");
}
doMyBackgroundWork();
sleep();
}
}
catch(Exception e){
ExceptionHandler.logAndSendException(e);
if(crashedListener != null){
crashedListener.onThreadCrashed();
}
}
catch(MyInterruptedException i) {
LOG.i("Execution stopping because of interrupt.");
}
}
private void sleep() {
try {
sleep(frequency);
} catch (InterruptedException e) {
throw new MyInterrptedException(e);
}
}
问题内容: 我在Java中的线程上有些挣扎,我有三个线程- 线程1,线程2和线程3。那些启动时正在执行某些任务,我想通过thread1停止这两个线程。我将thread1放在,然后停止两个线程,但是两个线程的进程仍在运行。你有什么想法吗? 问题答案: 您如何试图阻止他们??警告此方法已弃用。 而是考虑对线程1使用某种标志来与线程2和3通信,它们应该停止。实际上,您可能会使用interrupts。 下
我在C++中开发了一个状态设计模式,其中我有多个状态。某些状态的线程例程由限定。现在有这样的情况:一个状态转换到另一个状态,因此需要停止线程,并且需要通过清理内存。 因此,总而言之,我需要从线程例程本身停止线程。我怎样才能做到这一点呢? 或者有没有一种方法,当线程例程完成时,内存清理会自动发生? PS:问题是,当我从线程例程进行状态转换到另一个状态时,会调用当前状态析构函数。在当前状态的析构函数中
我正在为这个问题寻找一个干净的设计/解决方案:我有两个线程,可以运行用户想要的时间,但最终会在用户发出停止命令时停止。然而,如果其中一个线程突然终止(例如,由于运行时异常),我想停止另一个线程。 现在,这两个线程都执行一个(因此,当我说“stop a thread”时,我的意思是对实例调用一个stop()方法),我想的是避免使用线程(thread类),并使用interface,然后将这两个Runn
我在尝试停止运行多个线程的程序时遇到了问题,所有运行的线程都试图找到相同的解决方案,但一旦一个线程找到了解决方案,所有其他线程都将停止。 在main方法中,我创建了一个线程组,使用for循环向其中添加线程并启动它们 在实现Runnable的类中,我很难找出如何使其实现,以便一旦其中一个线程找到解决方案,所有线程都将停止。最终发生的情况是,要么其他线程继续运行,有时这些线程会相互中断并相互覆盖。
我需要使用两个线程将两个不同的字符附加到同一个JavaFX TextArea。我可以让一个工作,但是当我添加第二个线程时,它会因为一些很长的异常而中断。我做错了什么? 我研究了这个问题以寻求指导,它让我得到了一个线程工作,但不是两个:在两个独立的JavaFx TextArea中显示两个不同线程的输出
问题内容: 如果我有这样的Java代码: 并在调试中运行它,我可以看到所有这些线程(在取消之后)仍在运行,所以它们也占用了我的内存吗?如果是的话,我怎么能完全销毁那些线程? 问题答案: 调用您的线程,仅此而已。因此,您需要在您的方法中正确处理它。对于您的简单情况,您的线程将完成其执行,并且它们的对象将由GC清除。