java和threads:中断的异常以及如何正确使用BlockingQueue的take()方法

jbu*_*jbu 3 java multithreading interrupt wait

当队列中没有任何内容并调用take()时会发生什么.API表示该方法将等待,但这是否意味着CPU在队列中出现一个项目或者是否意味着线程会被中断唤醒之前,旋转检查是否为空/非空?如果是前者的情况,我可能想看看队列是否为空以及是否调用thread.yield()来放弃处理器时间.我的问题是,我是否需要调用yield或者是否有一些内部机制为我处理?

其次,中断的异常意味着什么?如果我理解正确,这意味着如果线程A正在执行此方法并且正在等待输入而另一个线程B调用threadA.interrupt(),那么线程A将捕获中断的异常并且可能会暂停执行,如果它很好的话.这是正确的思考方式吗?

Bri*_*new 5

请注意,BlockingQueue是一个接口.所以接下来是依赖于实现的.如果查看(例如)LinkedBlockingQueue的源代码,take()的源代码会在RentrantLock上调用lockInterruptibly().从这个文件:

如果锁不可用,那么当前线程将被禁用以进行线程调度,并且在发生以下两种情况之一之前处于休眠状态:

* The lock is acquired by the current thread; or
* Some other thread interrupts the current thread, and interruption of
Run Code Online (Sandbox Code Playgroud)

支持锁定获取.

我怀疑会有一些wait()/notify()或类似的事情发生.它会旋转CPU吗?不(通过top或类似检查)

回覆.关于中断的问题,Java专家时事通讯有一篇非常有趣的文章,关注interrupt()和处理InterruptedException.

阅读文章,但基本上如果您发现异常,则重新中断:

  try {
        Thread.sleep(1000);
      } catch (InterruptedException ex) {
        Thread.currentThread().interrupt(); // very important
        break;
      }
Run Code Online (Sandbox Code Playgroud)