gpt4 book ai didi

java - 为什么扩展了thread的内部类的执行线程是主线程呢?

转载 作者:行者123 更新时间:2023-12-01 18:10:31 24 4
gpt4 key购买 nike

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

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

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 个线程,主线程、线程 0、线程 1、线程 2、线程 3 和线程 4。正如我预期的那样,线程 0 - 4 的打印顺序是乱序的。

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

system.out.println("开始时"+ Thread.currentThread().getName());

它总是打印出“main”,并且线程按顺序执行。为什么内部类线程的执行是由主线程来进行的?

谢谢!

最佳答案

不要重写Thread.start()。 start 方法总是从启动它的线程中调用。您需要重写Thread.run()

(请参阅 Thread class' javadoc documentation 中的示例)

关于java - 为什么扩展了thread的内部类的执行线程是主线程呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33415714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com