我很难理解内部类线程的行为。
我有这个简单的测试程序。
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;并且顺序执行线程。为什么内部线程的执行是由主线程执行的?
谢谢!
答案 0 :(得分:4)
不要覆盖Thread.start()
。始终从启动它的线程调用start方法。您需要覆盖Thread.run()
。
答案 1 :(得分:0)
你不应该@Override
start()
方法。您应该@Override
run()
。然后拨打start()
。