sleep()方法如何在给定的线程和输出上工作?

时间:2013-09-30 11:01:10

标签: java multithreading

我知道sleep()用于在指定时间内休眠一个线程。我做了两个示例 - 在示例1中,我得到的输出为1234,因为我只创建了一个。在示例2中,我创建了2个线程实例,我得到输出11223,{{1 }},34

为什么输出不是4123,第一个帖子后跟41,{ {1}},2为第二个?

示例1:

3

示例2:

4

5 个答案:

答案 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方法。

但是,如果您将每个人放在startThread中:

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可用于其他线程并行运行的有效方法。睡眠不会释放锁定。但是需要注意调用睡眠并不意味着线程将被暂停一段时间。