在我的主要方法中,我做了以下工作:
ThreadGroup human = new ThreadGroup("Humans");
Thread s = new Thread(human, new Student(ca));
当我打印出System.out.println(s.getThreadGroup().getName());
线程所在组的名称时,它会打印出人类。但是当我进入Student类并执行以下操作:String threadGroupName = this.getThreadGroup().getName();
并打印出String变量时,它会打印出main
。我不明白这个,因为在创建这个帖子时,我已经将它描述为在Humans线程组中,为什么它说它在主线程组中呢?
答案 0 :(得分:1)
是您创建的新主题。然而,您的学生实例是 s.target
当您运行Thread构造函数来创建s时,您注入了新的Runnable(在您的情况下为Student实例)。
主题s =新主题(人类,新学生(ca));
s是thread-x,Student是thread-y。它们是单独的实例。
s.target是您创建的新Runnable学生。
希望这有帮助。
如果你想拥有相同的线程组,你必须传递"人类" 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() {
}
}
}
答案 1 :(得分:0)
我认为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());
}
}
}
代码是一个更完整的实现示例,您可以看到学生的构造函数,它将ThreadGroup作为参数,当前为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
为您提供了正确的群组,但这不是最终答案。您应该实现Thread
而不是从Runnable
扩展并将其传递给新实例化的Thread
我认为您是因为您需要获取线程的ThreadGroup而执行此操作,但这不是必需的可以在学生run
- 方法中看到如何通过调用Thread.currentThread()
返回您当前所在的主题来实现这一目标。您还可以看到使用它仍然有点棘手,因为您仍然可以{ {1}}因此,如果您从另一个方法(此处为main方法)中调用该方法,则在另一个线程中运行(同样是main
- 导致main
的线程作为最后一行的结果四条输出线。