如何获得线程组当前线程处于
在我的主要方法的名字,我也做了以下内容:如何获得线程组当前线程处于
ThreadGroup human = new ThreadGroup("Humans"); Thread s = new Thread(human, new Student(ca));
当我打印出该组的线程是由的名字System.out.println(s.getThreadGroup().getName());
然后它打印出人类。但是,当我进入学生课并执行以下操作时:String threadGroupName = this.getThreadGroup().getName();
并打印出字符串变量,它将输出main
。我不明白这是在创建这个线程时,我已经将它指定为人类线程组,为什么它说它在主线程组中?
回答:
s是您创建的新线程。而您的学生实例是s.target
当您运行线程构造函数创建s时,您注入了新的Runnable(学生实例在您的案例中)。
Thread s = new Thread(human,new Student(ca));
s是thread-x,Student是thread-y。它们是独立的实例。
s.target是您创建的新Runnable学生。
希望这会有所帮助。
如果你想拥有相同的线程组,你必须将“Humans”ThreadGroup传递给Student线程。试试这个:
public class ThreadGroups { public static void main(String[] args){
ThreadGroup human = new ThreadGroup("Humans");
Thread s1 = new Student(human, "studentThread");
Thread s = new Thread(human, s1);
System.out.println(s.getThreadGroup().getName());
System.out.println(s1.getThreadGroup().getName());
s.start();
}
static class Student extends Thread {
@Override
public void run() {
System.out.println(this.getThreadGroup().getName());
}
public Student(ThreadGroup group, String name) {
super(group, name);
}
public Student() {
}
}
}
回答:
我认为Student
从Thread
延伸,否则就不是一个getThreadGroup
方法调用。之所以得到main
,是因为您没有将human
传递给您的实例Student
,以便将线程分配给主组。
下面是一个例子类,应该表现出你的效果:
public class ThreadGroupTest { public final static void main(String[] args) throws Exception{
ThreadGroup human = new ThreadGroup("Humans");
Student student = new Student(null);
Thread s = new Thread(human, student);
synchronized(student) {
s.start();
student.wait(1000);
}
System.out.println(s.getThreadGroup().getName());
student.printThisThreadGroup();
student.printCurrentThreadGroup();
synchronized(student) {
student.killed = true;
student.notifyAll();
}
}
static class Student extends Thread {
Student(ThreadGroup group) {
super(group, (Runnable) null);
}
boolean killed;
@Override
public void run() {
System.out.println("running in group '" + Thread.currentThread().getThreadGroup().getName() + "'");
try {
while (!killed) {
synchronized(this) {
notifyAll();
wait(1000);
}
}
}
catch(Exception e) {
// ignore
}
}
public void printThisThreadGroup() {
System.out.println("this.getThreadGroup: " + this.getThreadGroup().getName());
}
public void printCurrentThreadGroup() {
System.out.println("CurrentThread: " + Thread.currentThread().getThreadGroup().getName());
}
}
}
的代码是你实现一个更完整的例子,可以看到学生的构造函数,一个线程组作为当前的参数null
。这相当于使用我假设你使用的默认构造函数(它不是你示例代码的一部分)。
执行此代码时,你得到下面的输出:
running in group 'main' Humans
this.getThreadGroup: main
CurrentThread: main
如果更改null
到human
输出将更改为以下:
running in group 'Humans' Humans
this.getThreadGroup: Humans
CurrentThread: main
这里this.getThreadGroup
为您提供了正确的组但它不是最终的答案。您应该实施Runnable
并将其传递给新实例化的Thread
,而不是从Thread
开始实施Thread
我想你是这么做的,因为您需要获得该线程的ThreadGroup,但这并不是必需的,因为您可以在学生的run
-方法中看到如何实现该目标通过致电Thread.currentThread()
返回您当前所在的线程。您还可以看到,使用这仍然有点棘手,因为如果您从另一个线程中运行的另一种方法(此处介绍的主要方法)调用该方法,那么结果仍然为main
(同样,main
-thread导致main
为:导致四条输出行的最后一行
以上是 如何获得线程组当前线程处于 的全部内容, 来源链接: utcz.com/qa/258039.html