Thread.sleep()在从多个线程调用时如何工作

时间:2010-08-21 06:26:57

标签: java multithreading static synchronization

sleep()是Thread类的静态方法。从多个线程调用时它是如何工作的。以及它如何找出当前执行的线程。 ?

或者可能是更通用的问题将是如何从不同的线程调用静态方法?会不会出现并发问题?

5 个答案:

答案 0 :(得分:7)

  

如何弄清楚当前的情况   执行线程?

它没有。它只调用操作系统,它总是睡眠调用它的线程。

答案 1 :(得分:6)

sleep方法会休眠当前线程,因此如果您从多个线程调用它,它将睡眠每个线程。还有currentThread静态方法,它允许您获取当前正在执行的线程。

答案 2 :(得分:0)

  

更通用的问题是如何从不同的线程调用静态方法?会不会出现并发问题?

如果一个或多个线程修改共享状态而另一个线程使用相同的状态,则只存在潜在的并发问题。 sleep()方法没有共享状态。

答案 3 :(得分:-1)

Thread.sleep(long)本身在java.lang.Thread类中实现。以下是其API文档的一部分:

 Causes the currently executing thread to sleep (temporarily cease 
 execution) for the specified number of milliseconds, subject to 
 the precision and accuracy of system timers and schedulers. The thread 
 does not lose ownership of any monitors.

sleep方法休眠调用它的线程。(根据EJP的注释)确定当前正在执行的线程(调用它并使其休眠)。 Java方法可以确定正在执行的线程通过调用Thread.currentThread()

来实现

可以同时从任意数量的线程调用方法(静态或非静态)。只要您的方法是thread safe,Threre就不会出现任何并发问题。 只有当多个线程在没有正确同步的情况下修改类或实例的内部状态时,才会遇到问题。

答案 4 :(得分:-1)

当虚拟机遇到sleep(long) - 语句时,它将中断当前正在运行的线程。那一刻的“当前线程”始终是调用Thread.sleep()的线程。然后它说:

  

喂!在这个线程中没什么可做的(因为我必须等待)。我将继续另一个主题。

更改线程称为“屈服”。 (注意:你可以通过调用Thread.yield();

自己屈服

因此,它不必弄清楚当前线程是什么。它始终是调用sleep()的Thread。 注意:您可以通过调用Thread.currentThread();

来获取当前主题

一个简短的例子:

// here it is 0 millis
blahblah(); // do some stuff
// here it is 2 millis
new Thread(new MyRunnable()).start(); // We start an other thread
// here it is 2 millis
Thread.sleep(1000);
// here it is 1002 millis

MyRunnablerun()方法:

// here it is 2 millis; because we got started at 2 millis
blahblah2(); // Do some other stuff
// here it is 25 millis;
Thread.sleep(300); // after calling this line the two threads are sleeping...
// here it is 325 millis;
... // some stuff
// here it is 328 millis;
return; // we are done;