【发布时间】:2012-02-22 04:54:48
【问题描述】:
我知道主线程上的getName()函数会返回字符串main,但这可以用setName()改变。
有什么方法可以始终确定应用程序的主线程吗?
【问题讨论】:
标签: java multithreading main
我知道主线程上的getName()函数会返回字符串main,但这可以用setName()改变。
有什么方法可以始终确定应用程序的主线程吗?
【问题讨论】:
标签: java multithreading main
一种可能性是在main() 的开头调用Thread.currentThread(),并保留引用。
【讨论】:
似乎主线程的 id 为1,如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();
}
}
【讨论】:
java.lang.Thread 源代码的一部分,所以它不是 JVM 内部的。
根据您的问题和您对 cmets 的回答,我建议以下两种方法:
将所有请求放到一个事件队列中,主线程将接受 来自请求队列的请求以调用您正在谈论的方法 关于。在这种情况下,必须有任何其他方法的合同 想要访问您正在谈论的方法只能这样做 通过事件队列(与 EDT 相同)。
在您希望被调用的方法中放置一个额外的参数
main 仅充当令牌。在方法内部检查令牌是否
正确(只有main 会拥有它/知道它)。如果它是正确的,那么
继续。否则返回false。当然如果允许你做这样的修改
【讨论】: