Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.Thread静态方法是如何工作的?_Java_Multithreading - Fatal编程技术网

java.lang.Thread静态方法是如何工作的?

java.lang.Thread静态方法是如何工作的?,java,multithreading,Java,Multithreading,例如,方法。此方法导致当前线程休眠,但它如何知道哪个线程是当前线程?静态方法是对象独立的,属于类,那么这种机制是如何工作的呢 此方法导致当前线程休眠,但它如何知道哪个线程是当前线程 当前线程由底层操作系统(或线程系统)管理。底层(依赖于系统)线程实现为当前线程提供句柄: 对于POSIX线程,有一个API调用返回当前执行线程的线程ID。您可以想象Thread.currentThread()最终调用此C函数,并将线程ID包装在JavaThread对象中,然后返回该对象 对于MS Windows,存

例如,方法。此方法导致当前线程休眠,但它如何知道哪个线程是当前线程?静态方法是对象独立的,属于类,那么这种机制是如何工作的呢

此方法导致当前线程休眠,但它如何知道哪个线程是当前线程

当前线程由底层操作系统(或线程系统)管理。底层(依赖于系统)线程实现为当前线程提供句柄:

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

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

此方法导致当前线程休眠,但它如何知道哪个线程是当前线程

当前线程由底层操作系统(或线程系统)管理。底层(依赖于系统)线程实现为当前线程提供句柄:

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

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


本机方法是特殊的。他们拥有JavaAPI之外的访问权限


在本例中,指向当前线程。您不能使用此方法将另一个线程置于睡眠状态-另一个线程必须自行执行此操作(但您显然可以向它发送消息)。

方法是特殊的。他们拥有JavaAPI之外的访问权限


在本例中,指向当前线程。您不能使用此方法使另一个线程进入睡眠状态-另一个线程将必须自己执行此操作(但显然,您可以向它发送消息).

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

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

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

这意味着您当前的线程将在一段时间内处于睡眠模式。 如果我写线程,睡眠(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

当前线程是实际执行代码段的线程。就这么简单

例如:

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

问题仍然是一样的-如果
currentThread()
是静态的,并且属于类,而不是具体的
Thread
对象,那么它是如何工作的?有一个具体的Thread对象(意思是与线程关联的数据),但它是由操作系统(或线程系统)管理的。通过静态方法,您基本上可以得到对应“当前”线程的Java包装器。回答得很好,谢谢!但是,请注意提问者的编辑,我看到你的编辑太晚了,无法接受你仍然可以撤销并接受不同的答案-@Anony Mouse,我当然不想撤销你的声誉,只是想指出,如果更合适,提问者仍然可以接受不同的答案:)+1。本质上:操作系统知道-它首先调度了线程。问题仍然是一样的-如果它是静态的并且属于类,而不是具体的
thread
对象,那么
currentThread()
如何工作?有一个具体的thread对象(意味着与线程关联的数据),但它是由操作系统管理的(或线程系统)。通过静态方法,基本上可以得到对应“当前”的Java包装器thread.很好的回答,谢谢!但是,请注意提问者的编辑,我看到你的编辑太晚了,无法接受你仍然可以撤销并接受不同的答案-@Anony Mouse,我当然不想撤销你的声誉,只是想提一下,如果更合适,提问者仍然可以接受不同的答案:)+1. 本质上:操作系统知道——它首先调度了线程。它提供了我问题的答案吗?它提供了我问题的答案吗?请参阅对@Sudhanshu Umalkar answer的评论见对@Sudhanshu Umalkar answer的评论每当有人对我说:“它超出了Java API的范围,不要碰它”。谢谢,我忘了检查java源代码了。这并没有超出java API的范围。它实际上根本不是用Java实现的,而是用肮脏、混乱、高度优化的C代码实现的。我不是想说“远离这个”,而是想说“不要试图将Java规则应用于这个方法,它不是Java”。每当有人对我说“它超出了Java API,不要碰这个”时,我都会哭。谢谢,我忘了查ja了