我有一个包含2个线程的程序,t1是超时线程,t2是这样的工作线程:
public class Test{
static Thread t1,t2;
public static void main(String[] args){
t1=new Thread(new Runnable(){
@Override
public void run(){
try{
Thread.sleep(1000);
}catch(Exception e){
}
if(!Thread.currentThread().isInterrupted()){
t2.interrupt();
System.out.println("request timeout");
}
}
});
t1.start();
t2=new Thread(new Runnable(){
@Override
public void run(){
try{
Thread.sleep(3000);
}catch(Exception e){
}
if(!Thread.currentThread().isInterrupted()){
t1.interrupt();
System.out.println("request succeed");
}
}
});
t2.start();
}
}
我知道它无效,因为Thread.currentThread()。isInterrupted()始终为false,输出为
request timeout
request succeed
我想要
request timeout
或
request succeed
只。所以我需要另一个标志来指示线程是否仍在工作。但是我不想扩展Thread类来添加一个自定义布尔属性,我发现Thread有一个name属性,我可以像这样使用name属性作为中断标志:
public class Test{
static Thread t1,t2;
public static void main(String[] args){
t1=new Thread(new Runnable(){
@Override
public void run(){
try{
Thread.sleep(1000);
}catch(Exception e){
}
if(!Thread.currentThread().getName().equals("")){
t2.setName("");
t2.interrupt();
System.out.println("request timeout");
}
}
},"t1");
t1.start();
t2=new Thread(new Runnable(){
@Override
public void run(){
try{
Thread.sleep(3000);
}catch(Exception e){
}
if(!Thread.currentThread().getName().equals("")){
t1.setName("");
t1.interrupt();
System.out.println("request succeed");
}
}
},"t2");
t2.start();
}
}
上面有什么问题吗?例如,
中是否存在任何并发问题t2.setName("");
t2.interrupt();
答案 0 :(得分:0)
根据Thread.interrupt()
的JAVA API文档,如果在处于睡眠模式的线程上调用此方法,则会清除中断状态,并且您将收到InterruptedException。因此,在你的情况下,当你执行t2.interrupt()时,线程2将从睡眠模式中断,睡眠方法将抛出InterruptedException(你可以捕获它并处理它)。由于在正在休眠的线程上调用interrupt()
时清除了中断状态,Thread.isInterrupted()
将始终返回false。
因此,为了获得您想要的输出,我的建议是在两个线程中对InterruptException进行异常处理,并处理相应打印的消息。