multithreading - 为什么 java.lang.Thread 中覆盖的 run 方法会产生奇怪的输出?
问题描述
我运行了以下代码。
public class ThreadDemo extends Thread{
public void run(){
System.out.println("running thread name
is:"+Thread.currentThread().getName());
System.out.println("Current Thread Priority
is"+Thread.currentThread().getPriority());
}
public static void main(String args[]){
ThreadDemo t1=new ThreadDemo();
ThreadDemo t2=new ThreadDemo();
t1.start();
t2.start();
}
}
我希望得到以下输出:
running thread name is:Thread-0
running thread priority is:5
running thread name is:Thread-1
running thread priority is:5
但是每次运行代码时,我都会得到相同的输出。
running thread name is:Thread-0
running thread name is:Thread-1
running thread priority is:5
running thread priority is:5
为什么第一个 System.out.println 打印两次,然后第二个 System.out.printlln 打印两次?为什么会有这种奇怪的行为?
解决方案
想象一场 100 米的比赛。法官开枪,赛跑者开始奔跑。您期望的是,1 号跑步者开始,通过 50m 和 100m 标记,然后 2 号跑步者开始,通过 50m 和 100m 标记。
但这不是比赛的运作方式。实际发生的是它们并行运行。他们都开始(一个可能比另一个快一点),都通过中途(一个或另一个顺序),都完成(可能以相同的顺序,也许一个人得到了突飞猛进的速度)。他们中的一个可能会绊倒,甚至在另一个跑过终点线之前还没有到达中点;但这是一种罕见的情况,很难预料。人们应该期望在比赛中具有类似技能的跑步者或多或少地并行运行。
这就是“并行”的含义,也是多线程首先存在的原因。每个线程都是一个运行器,它在您告诉它时启动,并与任何其他现有线程并行运行。如果你想按顺序执行你的代码——作为一个接力,而不是一场竞赛(即用你的话来说“不奇怪”)——你可能不应该使用多线程:)
推荐阅读
- java - 使用卡夫卡火花:NoSuchMethodError:org.apache.kafka.clients.consumer.KafkaConsumer.subscribe(Ljava/util/Collection;)
- python - 在索引处每行插入多个值
- sql - SQL。是否可以在查询中进行“统计”?
- python - 为什么这些 Keras Sequential 模型和 Functional API 行为不同?
- keras - 如何预训练 CNN 以将 CNN 权重传递给 LSTM?
- c# - Raycast 曾经阻止玩家穿过墙壁,只有一半的时间工作
- microsoft-teams - 列出 MS Teams 中用户的聊天消息引发禁止错误 - Graph Api
- xml - (Recursion-2) 所有深度级别元素的自动递增并保持遗传路径
- python - Python-Loop:从 opentopomap.org 下载 .png 并将单个 png 文件连接成一张大图
- amazon-s3 - 来自 S3 的 MemSQL 管道将 NULL 插入 DATE 类型列