例如方法public static void sleep(long millis)
。这种方法会导致当前线程进入休眠状态,但它是如何知道的?哪个线程是最新的?静态方法是独立于对象的,属于类,所以这个机制是如何工作的?java.lang.Thread静态方法如何工作?
回答
此方法会导致当前线程进入休眠状态,但它如何知道哪个线程是当前线程?
的电流线程由底层操作系统(或穿线系统)管理。底层(依赖于系统)线程执行提供了一个手柄到当前线程:
在POSIX线程情况下,存在该API调用pthread_self()它返回当前正在执行的线程的线程ID。你可以想象最终调用这个C函数的
Thread.currentThread()
并将线程ID包装在Java对象中,然后返回。在MS窗口的情况下,存在API调用GetCurrentThread(),其返回当前正在执行的线程的Windows句柄。再次,您可以考虑最终调用此C函数并将句柄包装在返回的Java
Thread
对象中。
native
方法是特殊的。他们可以访问Java API之外的内容。
在这种情况下,向当前线程。你不能使用这个方法来让另一个线程进入休眠状态 - 另一个线程本身必须执行此操作(但显然,你可以发送一条消息给它)。
每次有人对我说:“它超出了Java API,不要触摸它”。谢谢,我忘了检查Java源代码。 – Lies 2013-02-19 08:47:09
它不超越Java API。它实际上**并未在Java **中实现,而是在肮脏,杂乱,高度优化的C代码中实现。我并没有试图说“远离这个”,但我试图说“不要尝试将Java规则应用于这种方法,它不是Java”。 – 2013-02-19 08:53:37
该方法总是针对当前执行的线程进行调用。
这意味着您当前的线程将进入睡眠模式一段非常短的时间。例如:如果我将写入Thread.sleep(1000)线程将进入睡眠状态1000毫秒。 我们主要使用这个小节来介绍这个线程之间的交换。总之,它会给另一个执行线程提供机会。
查看评论@Sudhanshu Umalkar回答 – Lies 2013-02-19 08:45:03
当前线程是实际执行该代码段的线程。就如此容易。
例如:
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Before sleeping!");
Thread.sleep(10000);
System.out.println("After sleeping!");
}
}
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
System.out.println("Main thread!");
}
可输出类似:
Before sleeping! // t1
Main thread! // main
Before sleeping! // t2
After sleeping! // t1
After sleeping! // t2
它是否提供了我的问题的答案? – Lies 2013-02-19 08:44:18
- 1. 静态和非静态方法工作
- 2. 静态方法的工作
- 3. 静态方法工作
- 4. 如何使静态工厂方法不是静态实例?
- 5. django如何静态工作
- 6. AutoMapper静态工厂方法
- 7. 静态工厂方法(Spring)
- 8. 静态工厂方法
- 9. Autofac工厂静态方法
- 10. 静态工厂方法
- 11. 静态工厂方法
- 12. 只有“静态”的方法签名是如何工作的?
- 13. 同步静态方法在Java中如何工作?
- 14. 如何做静态方法?
- 15. 如何在静态方法
- 16. 如何在静态方法
- 17. 如何从静态方法输入非静态方法
- 18. 如何用非静态方法覆盖静态方法?
- 19. 如何从静态方法调用非静态方法android
- 20. 如何从静态方法调用非静态方法
- 21. 如何从静态方法调用非静态方法?
- 22. 如何从一个静态方法调用非静态方法
- 23. 如何从静态方法调用非静态方法?
- 24. 如何在静态方法中访问静态和非静态方法
- 25. Html.RenderAction作为静态方法
- 26. 静态静态方法?
- 27. 静态工厂方法vs工厂
- 28. 静态方法
- 29. 静态方法
- 30. 静态方法
@Downvoter,评论你的行动,请 – Lies 2013-02-19 11:57:38