2013-02-19 29 views

回答

3

此方法会导致当前线程进入休眠状态,但它如何知道哪个线程是当前线程?

电流线程由底层操作系统(或穿线系统)管理。底层(依赖于系统)线程执行提供了一个手柄到当前线程:

  • POSIX线程情况下,存在该API调用pthread_self()它返回当前正在执行的线程的线程ID。你可以想象最终调用这个C函数的Thread.currentThread()并将线程ID包装在Java对象中,然后返回。

  • MS窗口的情况下,存在API调用GetCurrentThread(),其返回当前正在执行的线程的Windows句柄。再次,您可以考虑最终调用此C函数并将句柄包装在返回的Java Thread对象中。

+0

问题仍然是相同的 - 如何做'currentThread()'如果它工作静态和属于类,而不是具体的'线程'对象? – Lies 2013-02-19 08:40:06

+0

*有一个具体的Thread对象(意味着与该线程相关的数据),但它由操作系统(或线程系统)管理。通过静态方法,您基本上可以获得相应“当前”线程的Java包装。 – 2013-02-19 08:49:46

+0

很好的答案,谢谢!但是,请支持提问者关注编辑,我看到您的编辑已经太迟以至于无法接受 – Lies 2013-02-19 08:58:53

3

native方法是特殊的。他们可以访问Java API之外的内容。

在这种情况下,向当前线程。你不能使用这个方法来让另一个线程进入休眠状态 - 另一个线程本身必须执行此操作(但显然,你可以发送一条消息给它)。

+0

每次有人对我说:“它超出了Java API,不要触摸它”。谢谢,我忘了检查Java源代码。 – Lies 2013-02-19 08:47:09

+1

它不超越Java API。它实际上**并未在Java **中实现,而是在肮脏,杂乱,高度优化的C代码中实现。我并没有试图说“远离这个”,但我试图说“不要尝试将Java规则应用于这种方法,它不是Java”。 – 2013-02-19 08:53:37

0

该方法总是针对当前执行的线程进行调用。

0

这意味着您当前的线程将进入睡眠模式一段非常短的时间。例如:如果我将写入Thread.sleep(1000)线程将进入睡眠状态1000毫秒。 我们主要使用这个小节来介绍这个线程之间的交换。总之,它会给另一个执行线程提供机会。

+0

查看评论@Sudhanshu Umalkar回答 – Lies 2013-02-19 08:45:03

0

当前线程是实际执行该代码段的线程。就如此容易。

例如:

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 
+0

它是否提供了我的问题的答案? – Lies 2013-02-19 08:44:18