有没有办法区分主线程与它产生的任何线程?

时间:2012-01-30 11:30:48

标签: java multithreading main

我知道主线程上的getName()函数将返回字符串main,但可以使用setName()进行更改。

有没有办法总是确定应用程序的主线程?

3 个答案:

答案 0 :(得分:8)

一种可能性是在main()的开头致电Thread.currentThread(),并保留参考资料。

答案 1 :(得分:5)

似乎主线程的1 id Thread.getId()表示:

class test{
    public static boolean isMainThread(){
        return Thread.currentThread().getId() == 1;
    }

    public static void main(String[]args){
        System.out.println(isMainThread());
        new Thread( new Runnable(){
            public void run(){
                System.out.println(isMainThread());
            }
        }).start();
    }
}    

我不确定它是否是规范的一部分或特定于实现的功能。

这是一种更便携的方式:

class test{

    static long mainThreadId = Thread.currentThread().getId();

    public static boolean isMainThread(){
        return Thread.currentThread().getId() == mainThreadId;
    }

    public static void main(String[]args){
        System.out.println(isMainThread());
        new Thread( new Runnable(){
            public void run(){
                System.out.println(isMainThread());
            }
        }).start();
    }
}    

需要注意的是mainThreadId必须位于由主线程加载的类中(例如,包含main方法的类)。例如,这不起作用:

class AnotherClass{
    static long mainThreadId = Thread.currentThread().getId();

    public static boolean isMainThread(){
        return Thread.currentThread().getId() == mainThreadId;
    }
}
class test{
    public static void main(String[]args){
        //System.out.println(isMainThread());
        new Thread( new Runnable(){
            public void run(){
                System.out.println(AnotherClass.isMainThread());
            }
        }).start();
    }
}    

答案 2 :(得分:2)

从您的问题和您对评论的回答中,我建议采用以下两种方法:

  1. 将所有请求放入事件队列,主线程将采用 来自请求队列的请求调用您正在谈论的方法 关于。在这种情况下,必须有任何其他方法的合同 想要访问你正在谈论的方法只能做到这一点 通过事件队列(与EDT相同的想法)。

  2. 在要调用的方法中放置一个额外的参数 main仅用作令牌。在方法中检查令牌是否为 正确(只有main会有/知道它。)如果它是正确的那么 继续。否则返回false。当然,如果你被允许做出这样的修改