Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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中的块不旋转?_Java_Multithreading - Fatal编程技术网

Java中的块不旋转?

Java中的块不旋转?,java,multithreading,Java,Multithreading,Java中的某些方法会一直阻塞,直到它们能够执行某些操作为止,例如ServerSocket.accept()和InputStream.read(),但我很难找到它是如何做到这一点的。我能想到的最接近的事情是每次都使用一个线程.sleep()进行while()循环,但是睡眠时间越长,阻塞的响应性越差,睡眠时间越短,发生的旋转越多 我有两个问题: 各种标准函数(如上述函数)是如何阻塞的?本机代码?while()循环?还有别的吗 我应该如何实现阻塞的方法 您列出的操作由于底层平台(即本机代码)而阻塞

Java中的某些方法会一直阻塞,直到它们能够执行某些操作为止,例如ServerSocket.accept()和InputStream.read(),但我很难找到它是如何做到这一点的。我能想到的最接近的事情是每次都使用一个线程.sleep()进行while()循环,但是睡眠时间越长,阻塞的响应性越差,睡眠时间越短,发生的旋转越多

我有两个问题:

  • 各种标准函数(如上述函数)是如何阻塞的?本机代码?while()循环?还有别的吗

  • 我应该如何实现阻塞的方法


  • 您列出的操作由于底层平台(即本机代码)而阻塞


    您可以使用Java的
    Object.wait()
    Object.notify()方法实现一个块
    wait()
    将阻止调用线程,直到另一个线程在同一个锁上调用
    notify()

    我可以回答第1部分。他们使用操作系统来处理它,因为每个操作系统都已经内置了信令和阻塞,作为支持多任务的一部分

    通常,如果您必须实现自己的旋转锁代码,那么要么您使用了错误的方法。旋转还减少了任何形式的电源管理,即使使用良好的睡眠,代码仍然必须醒来才能不做任何事情。

    要回答(2)您希望对象方法等待、通知和通知所有

    使用Object.wait()时,必须将等待包含在一个循环中,该循环检查等待的条件。wait()方法可能会错误地返回(出于微妙的原因)

    此外,您还需要考虑是否需要使用notify()或notifyAll()-如果所有等待的线程都在等待完全相同的条件,并且您只需要一个线程来处理您要通知的内容,则可以使用notify(),否则需要使用notifyAll(),由于您无法保证哪个线程将在notify()上得到通知,因此,例如,您不能期望它们是圆形的

    最后,请确保查看java.util.concurrent包——它有许多比使用java原语更高级、更好的解决常见线程问题的解决方案。

    对(1)的基本回答是“不用担心,操作系统会处理它”。对输入流读取之类的调用本质上是操作系统调用的包装。在操作系统内部,我认为在这些情况下,当调用“阻塞”时,通常会发生的情况是,操作系统“知道”它正在等待来自(比如)磁盘控制器的硬件中断,以表示这样或那样的请求数据现在可用,并且它知道线程X是请求该数据的线程。所以它不会在线程X中再次调度,直到它接收到那个中断(或者一个说“有一个错误”的中断)为止。(线程调度算法的一部分是这样做的,比如当等待的数据可用时,为等待的线程提供某种形式的临时“提升”。同样,通常你不需要对此太担心。)或者换句话说:不管这种机制的确切细节如何,它不适用于普通Java程序员

    在(2)中,我建议更多地考虑“我如何做X件事,这可能发生在block上”。我认为答案很难是你想要做的事情是故意的“阻塞”,不管X是什么,可能有一个库方法/类可以为你做这件事。例如(链接包括我就这些主题编写的一些材料):

    • 如果要在下一个消息/作业从某个队列/提供程序可用时接收该消息/作业,请查看
    • 如果您需要控制对一个共享资源的访问,在对象上有一个“锁”,等待锁在必要时可用,请考虑普通的旧同步,或者;李>
    • 如果要等待多个集合资源中的一个可用,请查看
    我想说,Java 5并发API基本上不推荐使用原始的等待/通知机制。无论你在做什么,旋转锁定通常是最后的选择