我可以使用线程的名称作为自定义中断标志吗?

时间:2016-02-05 03:21:48

标签: java multithreading thread-safety

我有一个包含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();

1 个答案:

答案 0 :(得分:0)

根据Thread.interrupt()的JAVA API文档,如果在处于睡眠模式的线程上调用此方法,则会清除中断状态,并且您将收到InterruptedException。因此,在你的情况下,当你执行t2.interrupt()时,线程2将从睡眠模式中断,睡眠方法将抛出InterruptedException(你可以捕获它并处理它)。由于在正在休眠的线程上调用interrupt()时清除了中断状态,Thread.isInterrupted()将始终返回false。

因此,为了获得您想要的输出,我的建议是在两个线程中对InterruptException进行异常处理,并处理相应打印的消息。