为什么扩展线程的内部类的执行线程是主线程?

时间:2015-10-29 13:34:13

标签: java multithreading

我很难理解内部类线程的行为。

我有这个简单的测试程序。

public class Test {
    private static Random rand = new Random(System.currentTimeMillis());

    public class TestThread extends Thread {
        @Override
        public void start() {
            System.out.println("in start " + Thread.currentThread().getName());
            try {
                Thread.sleep(rand.nextInt(5000));
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args){
        System.out.println(Thread.currentThread().getName());
        for(int i = 0; i < 5; ++i){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(rand.nextInt(5000));
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName());
                }
            }).start();
        }

        System.out.println("new run");
        Test test = new Test();
        for(int i = 0; i < 5; ++i){
            (test. new TestThread()).start();
        }
    }
}

当第一个for循环运行时,线程的行为与我预期的一样。总共6个线程,main,thread-0,thread-1,thread-2,thread-3和thread-4。如我所料,线程0 - 4按顺序打印。

第二个for循环的结果让我感到困惑。

system.out.println("in start " + Thread.currentThread().getName());

它总是打印出&#34; main,&#34;并且顺序执行线程。为什么内部线程的执行是由主线程执行的?

谢谢!

2 个答案:

答案 0 :(得分:4)

不要覆盖Thread.start()。始终从启动它的线程调用start方法。您需要覆盖Thread.run()

(参见Thread class' javadoc documentation

中的例子

答案 1 :(得分:0)

你不应该@Override start()方法。您应该@Override run()。然后拨打start()