我知道sleep()
用于在指定时间内休眠一个线程。我做了两个示例 - 在示例1中,我得到的输出为1
,2
,3
,4
,因为我只创建了一个。在示例2中,我创建了2个线程实例,我得到输出1
,1
,2
,2
,3
,{{1 }},3
,4
。
为什么输出不是4
,1
,2
,3
,第一个帖子后跟4
,1
,{ {1}},2
为第二个?
示例1:
3
示例2:
4
答案 0 :(得分:7)
您已创建了两个Runnable
个对象。如果您通过调用他们的run
方法来运行它们,您将得到您想象的结果:
Aaa m1=new Aaa(); // creating one object
Aaa m2=new Aaa(); // creating second object of a class
System.out.println("Calling m1.run()");
m1.run(); // we call run method
System.out.println("Calling m2.run()");
m2.run();
输出
Calling m1.run()
1
2
3
4
Calling m2.run()
1
2
3
4
因为该方法一个接一个地执行两次。
请注意,调用run
的{{1}}方法不是运行线程的常规方法。您通常会使用Runnable/Thread
方法。
但是,如果您将每个人放在start
和Thread
中:
start
现在每个对象都在自己的线程并行中运行,因此输出是交错的:
Aaa m1=new Aaa(); // creating one object
Aaa m2=new Aaa(); // creating second object of a class
System.out.println("Calling m1.start()");
m1.start(); // thread calls run method
System.out.println("Calling m2.start()");
m2.start();
顺序显然会根据线程的交错方式而有所不同。
可能让您感到困惑的一件事是您已选择Calling m1.start()
Calling m2.start()
1 < From thread 1
1 < From thread 2
2 ...
2
3
3
4
4
。这是不鼓励的。 extend Thread
更好 - 就像这样:
implement Runnable
现在更清楚的是,您的对象在两个不同的线程中运行,因此并行运行。
答案 1 :(得分:1)
两个线程同时工作 - 这是线程使用的主要点。如果你想要在主线程上完成某些事情 - 你可以启动一个新线程。或两个如果需要执行两个任务,并且每个任务都在它自己的线程上工作,而不是等待另一个任务。
答案 2 :(得分:1)
m1和m2从主线程获得相同的优先级并同时工作。 sleep()允许线程进入阻塞状态x毫秒。当线程进入休眠状态时,它不会释放锁定。
答案 3 :(得分:0)
要获得所需的输出1,2,3,4,1,2,3,4,请使用join()方法。 您可以使用此方法控制线程执行。
Aaa m1=new Aaa();
//创建一个对象
Aaa m2=new Aaa();
//创建类的第二个对象
m1.start(); //调用run方法
m1.join()
;
m2.start();
答案 4 :(得分:0)
睡眠将暂停特定时间段的执行。这是使cpu可用于其他线程并行运行的有效方法。睡眠不会释放锁定。但是需要注意调用睡眠并不意味着线程将被暂停一段时间。