0

例如方法public static void sleep(long millis)。这个方法导致当前线程休眠,但是它怎么知道哪个线程是当前线程呢?静态方法是对象无关的,属于类,那么这种机制是如何工作的呢?

4

5 回答 5

3

这个方法导致当前线程休眠,但是它怎么知道哪个线程是当前线程呢?

当前线程由底层操作系统(或线程系统)管理底层(系统相关)线程实现提供了当前线程的句柄:

  • 对于POSIX线程,API 调用pthread_self()返回当前执行线程的线程 ID。您可以考虑Thread.currentThread()最终调用此 C 函数并将线程 ID 包装在一个 JavaThread对象中,然后返回该对象。

  • MS Windows的情况下,API 调用GetCurrentThread()返回当前执行线程的 Windows 句柄。同样,您可以考虑Thread.currentThread()最终调用此 C 函数并将 Handle 包装在Thread返回的 Java 对象中。

于 2013-02-19T08:37:19.180 回答
3

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

在这种情况下,到当前线程。您不能使用此方法使另一个线程进入睡眠状态 - 另一个线程必须自己执行此操作(但显然您可以向它发送消息)。

于 2013-02-19T08:39:19.377 回答
0

始终为当前/正在执行的线程调用此方法。

于 2013-02-19T08:40:30.140 回答
0

这意味着您当前的线程将进入睡眠模式一段时间。例如:如果我写 Thread.sleep(1000) 线程将进入睡眠状态 1000 毫秒。我们使用这种方法主要是在线程之间进行交换。总之,它会给另一个线程执行的机会。

于 2013-02-19T08:41:26.240 回答
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
于 2013-02-19T08:41:31.447 回答