2016-02-01 43 views
6

我目前正在学习Java中的线程基础知识,并且正在尝试编写一个简单的线程组程序。虽然我得到了不同类型的输出,但我和教程网站一样写了它。下面是我的代码,我得到不同的输出。Java中的ThreadGroup

public class ThreadGroupDemo implements Runnable { 

    @Override 
    public void run() { 
     System.out.println(Thread.currentThread().getName()); 
     // get the name of the current thread. 
    } 

    public static void main(String[] args) { 
     ThreadGroupDemo runnable = new ThreadGroupDemo(); 
     ThreadGroup tg1 = new ThreadGroup("Parent Group"); 
     // Creating thread Group. 

     Thread t1 = new Thread(tg1, new ThreadGroupDemo(), "one"); 
     t1.start(); 
     t1.setPriority(Thread.MAX_PRIORITY); 

     Thread t2 = new Thread(tg1, new ThreadGroupDemo(), "second"); 
     t2.start(); 
     t2.setPriority(Thread.NORM_PRIORITY); 

     Thread t3 = new Thread(tg1, new ThreadGroupDemo(), "Three"); 
     t3.start(); 

     System.out.println("Thread Group name : " + tg1.getName()); 
     tg1.list(); 
    } 

} 

我越来越 输出:

Thread Group name : Parent Group 
Three 
java.lang.ThreadGroup[name=Parent Group,maxpri=10] 
    second 
one 
Thread[one,10,Parent Group] 
    Thread[second,5,Parent Group] 
    Thread[Three,5,Parent Group] 

输出应该是这样的:

one 
two 
three 
Thread Group Name: Parent ThreadGroup 
java.lang.ThreadGroup[name=Parent ThreadGroup,maxpri=10] 
    Thread[one,5,Parent ThreadGroup] 
    Thread[two,5,Parent ThreadGroup] 
    Thread[three,5,Parent ThreadGroup] 

我不能够理解为什么会这样呢?设置优先级可以帮助它吗?

+0

答案很简单:本教程是错误的。唯一确实保证的是线程组名将出现在线程组列表之前。 – biziclop

+5

http://www.javatpoint.com/threadgroup-in-java –

+4

这很震撼。我建议你改用[官方教程](https://docs.oracle.com/javase/tutorial/essential/concurrency/)。并且忘掉[线程组](http://stackoverflow.com/questions/3265640/why-threadgroup-is-being-criticised),无论如何它们都是无用的。设置线程的优先级也是如此。 – biziclop

回答

3

即使拥有一定的优先级,您也无法预测线程的执行顺序。您无法控制调度。这是你的操作系统决定的。

一本好书,关于并发在Java中:Java concurrency in practice

+0

此外,即使家庭计算机现在有多个核心,能够实际运行并行多线程。这使得新开始的线程更有可能计划立即运行。 – biziclop