如何获取当前线程所在的线程组的名称

时间:2017-12-02 19:49:53

标签: java multithreading

在我的主要方法中,我做了以下工作:

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线程组中,为什么它说它在主线程组中呢?

2 个答案:

答案 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)

我认为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());
        }

    }
}

代码是一个更完整的实现示例,您可以看到学生的构造函数,它将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的线程作为最后一行的结果四条输出线。