1、答:
Thread::interrupted()
是一个静态方法,用于判断当前线程是否被中断,并清除中断标志位。
具体来说,当一个线程被中断后,它的中断状态将被设置为 true
。如果在接下来的某个时间点内调用了该线程的 interrupted()
方法,返回值为 true
表示该线程已经被中断。此时,如果需要继续等待该线程执行完毕,可以根据具体情况来决定是否重新中断该线程,例如重新设置中断标志位或者抛出 InterruptedException
异常。
需要注意的是,Thread::interrupted()
方法会清除当前线程的中断状态,因此在使用该方法时需要小心。如果当前线程确实被中断了,而在清除中断标志位之前,其他线程又将该线程中断了,那么在调用 interrupted()
方法后,返回值将为 false
,此时就可能造成对线程的中断状态判断出现问题。
因此,在多线程编程中,通常建议使用 Thread::isInterrupted()
方法来判断线程的中断状态,该方法不会清除中断标志位,能够更加安全地判断当前线程是否被中断。
2、答:
在 Java 中,中断线程通常通过设置中断标志位来实现。具体来说,当需要中断一个线程时,可以调用该线程的 interrupt()
方法来设置中断标志位,然后再根据具体情况来处理中断事件。
下面是一个中断线程的示例代码:
class MyThread extends Thread {public void run() {while (!Thread.currentThread().isInterrupted()) {// 在这里执行线程的具体逻辑// 如果需要检测中断标志位,可以调用 Thread.currentThread().isInterrupted() 方法// 如果需要响应中断事件,可以在这里抛出 InterruptedException 异常// 如果不需要检测中断标志位,可以省略这个判断条件}}
}// 在另一个线程中调用 MyThread.interrupt() 方法来中断线程
MyThread thread = new MyThread();
thread.start();
thread.interrupt();
在上面的示例代码中,我们创建了一个 MyThread
类来表示一个工作线程,该线程在执行过程中不断检测中断标志位,如果检测到中断标志位被设置,则退出循环。在另一个线程中,我们创建了一个 MyThread
实例并启动它,然后调用 interrupt()
方法来中断该线程。
需要注意的是,interrupt()
方法只是设置了中断标志位,它并不会立即停止线程的执行,因此在实际应用中需要根据具体情况来处理中断事件。例如,如果线程正在执行阻塞操作(如等待 I/O 或者睡眠),则需要在阻塞操作中响应中断事件,例如抛出 InterruptedException
异常来停止线程的执行。另外,如果线程没有响应中断事件,也可以在外部调用 Thread::stop()
方法来强制停止线程,但这种方法不安全,可能会导致数据不一致等问题,因此不建议使用。