我知道主线程上的getName()
函数将返回字符串main
,但可以使用setName()
进行更改。
有没有办法总是确定应用程序的主线程?
答案 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)
从您的问题和您对评论的回答中,我建议采用以下两种方法:
将所有请求放入事件队列,主线程将采用 来自请求队列的请求调用您正在谈论的方法 关于。在这种情况下,必须有任何其他方法的合同 想要访问你正在谈论的方法只能做到这一点 通过事件队列(与EDT相同的想法)。
在要调用的方法中放置一个额外的参数
main仅用作令牌。在方法中检查令牌是否为
正确(只有main
会有/知道它。)如果它是正确的那么
继续。否则返回false。当然,如果你被允许做出这样的修改