例如方法public static void sleep(long millis)
。这个方法导致当前线程休眠,但是它怎么知道哪个线程是当前线程呢?静态方法是对象无关的,属于类,那么这种机制是如何工作的呢?
5 回答
这个方法导致当前线程休眠,但是它怎么知道哪个线程是当前线程呢?
当前线程由底层操作系统(或线程系统)管理。底层(系统相关)线程实现提供了当前线程的句柄:
对于POSIX线程,API 调用pthread_self()返回当前执行线程的线程 ID。您可以考虑
Thread.currentThread()
最终调用此 C 函数并将线程 ID 包装在一个 JavaThread
对象中,然后返回该对象。在MS Windows的情况下,API 调用GetCurrentThread()返回当前执行线程的 Windows 句柄。同样,您可以考虑
Thread.currentThread()
最终调用此 C 函数并将 Handle 包装在Thread
返回的 Java 对象中。
native
方法很特别。他们可以访问 Java API 之外的内容。
在这种情况下,到当前线程。您不能使用此方法使另一个线程进入睡眠状态 - 另一个线程必须自己执行此操作(但显然您可以向它发送消息)。
始终为当前/正在执行的线程调用此方法。
这意味着您当前的线程将进入睡眠模式一段时间。例如:如果我写 Thread.sleep(1000) 线程将进入睡眠状态 1000 毫秒。我们使用这种方法主要是在线程之间进行交换。总之,它会给另一个线程执行的机会。
当前线程是实际执行这段代码的线程。就如此容易。
例如:
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