如果我覆盖我的运行功能,
Thread t = new Thread(){
public void run(){
try {
if(Thread.currentThread().isInterrupted()) {
doSomePrcocess() // is the isInerrupted() flag seeting to true?
return; //Terminates the current Thread
}
//otherwise
runScript();
} catch (Exception e) {
e.printStackTrace();
}
}
};
t.start();
然后如果我从代码中的任何一点调用Thread.currentThread().interrupt()
,那么线程是否应该停止并在那时开始运行doSomeProcess()?如果是,那么中断的标志如何设置为真?如果不是,该怎么做?
答案 0 :(得分:2)
抛出InterruptedException
Thread类具有处理线程中断的条件
public void interrupt()
public static boolean interrupted()
public boolean isInterrupted()
如果你打算只执行一次doSomePrcocess,那么你必须检查并清除连续调用的Thread中断状态。
public static boolean interrupted()
使用以下内容只会检查状态而不进行修改。
public boolean isInterrupted()
答案 1 :(得分:1)
我在下面的代码中有一个带有注释的运行示例。尝试运行几次以查看它是否可以阐明您的概念。
通常,您将从另一个线程中中断一个线程,是的,doSomeProcess将在循环的下一个周期中调用,该周期可能是该线程被中断后1毫秒,也可能是您的方法中实现的逻辑之后1个小时。 >
public class InterruptTest {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread() {
public void run() {
while (true) {
try {
if (Thread.currentThread().isInterrupted()) {
doSomePrcocess(); // is the isInerrupted() flag seeting to true? - Yes
return; // Terminates the current Thread - yes
}
// otherwise
runScript();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void runScript() {
System.out.println("runScript interrupted status:" + this.isInterrupted());
sleepy(100);
}
private void doSomePrcocess() {
System.out.println("doSomePrcocess interrupted status:" + this.isInterrupted());
sleepy(500);
}
private void sleepy(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Thread.currentThread().interrupt(); // try commenting this out to see what happens.
}
}
};
t.start();
Thread.sleep(1000);
t.interrupt(); // generally you would call interrupt on another thread.
}
}
答案 2 :(得分:0)
不,它不会那样工作。 isInterrupted
方法检查标志是否已设置,它不会声明处理程序。无法定义在线程中断时自动调用的中央处理程序。您可以做的是捕获InterruptedException
并调用处理程序,并定期检查中断标志以查看是否该停止。