【问题标题】:Setting Interrupt Reason while interrupting a Thread在中断线程时设置中断原因
【发布时间】:2011-02-28 06:19:35
【问题描述】:

感谢所有的帮助和支持,我面临一个问题,我有两个线程,一个是定时器线程,另一个是文件阅读器线程。现在我的主程序正在调用这两个线程。定时器线程在超时时中断主程序,文件读取器线程在出现一些 IO 错误时调用主线程。所以现在问题出现了,主程序必须知道是谁触发了中断,然后打印一些中断状态。那么我该如何实现呢?下面是一些我不想使用的东西。

  1. 一个用于设置超时的标志和另一个用于 IO 错误的标志(因为我的主程序很大并且有几个部分,我无法在任何地方进行此检查)
  2. 每个线程都有一个设置了状态码的成员变量,主程序在中断时读取它。(我对此没问题,但我仍然需要维护线程对象以获取状态,我的文件读取器线程是很多,所以我必须遍历每个线程才能找到被中断的线程)。

非常感谢您的帮助,即使是中断以外的其他方式也可以。

【问题讨论】:

  • 定时器线程中断主程序是什么意思?您希望主程序中正在进行的任何处理都结束吗?为什么计时器或文件读取线程不能只生成输出(或将输出发布到事件处理线程,如果这是一个事件驱动程序)。我认为我们需要有关程序架构的更多信息来提出任何建议。
  • 将输出发布到偶数处理线程????嗯,实际上我创建了 n 个线程来执行并发文件操作,如果我期待每个线程的输出,那么我必须等待每个线程的输出,然后我才能创建并触发下一个线程,所以它不会占用多线程的真正优势不是它。我需要的是我想创建那些 n 个线程,如果有任何错误,它们应该返回给我,我需要哪个线程(比如文件名)和什么错误。顺便说一下,我所指的主程序是事件处理线程在这里。
  • @sameer , 信号 ?? , 你能详细说明如何使用它们吗?
  • 为什么?读取文件怎么会有超时?这一切似乎都过于复杂了。

标签: java multithreading interrupt


【解决方案1】:

我通过声明一个异常变量来做到这一点,然后如果等待线程收到设置了异常变量的中断,我会重新抛出异常:

IOException ioex;

synchronized(lockObject) {
    while( true ) {
        try {
            lockObject.wait();
        } catch( InterruptedException e ) {
            if( ioex != null ) { 
                throw ioex;
            }
        }
        ... normal handling ...
    }
}

【讨论】:

  • 但是你的 run() 方法,不支持抛出任何异常,根据它在 Thread.run() 中的声明。那么如何重新抛出??
  • 对不起,我没有完全理解你的问题。在这种情况下,只需处理异常而不是重新抛出它。如果你不知道如何处理它,就不要抓住它。如果是线程的run()方法,出现异常最好有plan B。
  • @Daniel ,我正在做一个 thread[i].join 并等待一些 n 个线程完成,如果任何线程有任何错误它将中断我(他们将调用 targetThread.interrupt () 方法来中断调用线程)。但是我必须知道是哪个线程打断了我根据线程信息做一些特殊的处理。
  • 让我发布一些我发现一些建议的线程,但我正在寻找的答案可能有助于理解我的问题。 forums.oracle.com/forums/…coderanch.com/t/233923/threads/java/…
  • 你为什么不声明一个 Thread 类型的静态 volatile 变量,在执行中断之前存储中断的线程?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多