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

Jiv*_*ngs 5 java multithreading program-entry-point

我知道getName()主线程上的函数将返回String main,但是可以使用setName().

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

NPE*_*NPE 8

一种可能性是Thread.currentThread()在开始时调用main(),并保持参考.

  • 听起来像你有一个设计问题;-)如果你必须有这个,我会简单地记录它(像大多数GUI框架一样记录了你只能从事件调度程序线程进行UI更新的事实). (5认同)

Vla*_*lad 5

看来,主线程都有一个ID1通过所示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();
    }
}    
Run Code Online (Sandbox Code Playgroud)

我不确定它是规范的一部分还是特定于实现的功能.

这是一种更便携的方式:

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();
    }
}    
Run Code Online (Sandbox Code Playgroud)

警告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();
    }
}    
Run Code Online (Sandbox Code Playgroud)

  • 好一个.我猜这是特定于实现的,因为线程存储结构不是由JVM规范定义的. (3认同)
  • @Jivings:不,假设未记录的行为在不同的JavaVM实现或版本之间不会改变或保持一致是绝对不合理的。 (2认同)