如何获得线程组当前线程处于

在我的主要方法的名字,我也做了以下内容:如何获得线程组当前线程处于

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() {

}

}

}

回答:

我认为StudentThread延伸,否则就不是一个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

如果更改nullhuman输出将更改为以下:

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

回到顶部