2017-12-02 76 views
1

在我的主要方法的名字,我也做了以下內容:如何獲得線程組當前線程處於

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。我不明白這是在創建這個線程時,我已經將它指定爲人類線程組,爲什麼它說它在主線程組中?

+0

有一個答案對你有幫助嗎? – Lothar

回答

0

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() { 
     } 
    } 
} 
+0

好吧我想我知道你的意思,所以爲了讓他們引用同一個實例,我應該創建一個學生對象' Student studentThread = new Student(ca);'然後將這個obj傳遞給線程構造函數的參數? – dfqupwndguerrillamailde

+0

我假設學生擴展線程的權利?你想讓學生和你的線程擁有相同的組嗎? –

+0

I在我的答案中添加了一個示例代碼,以獲得相同的ThreadGroup。 –

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

    } 
} 

的代碼是你實現一個更完整的例子,可以看到學生的構造函數,一個線程組作爲當前的參數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爲:導致四條輸出行的最後一行