相关疑难解决方法(0)

Java线程状态转换,WAITING到BLOCKED还是RUNNABLE?

SO共识与互联网上几乎每个Java线程状态图之间似乎存在差异; 具体来说,关于 WAITING之后的线程状态转换notify()或被notifyAll()调用...

  • 等待永远不会直接进入RUNNABLE
  • 该线程正在等待直到通知...然后它变为 BLOCKED ...
  • 一旦通知此线程,它将无法运行 ...这 ...阻塞状态.

所以关于SO的共识是:一个线程从调用之后转换WAITING到; 或者; 下图说明了绿色的这种转变.BLOCKEDnotify()notifyAll()

为什么网上的大多数状态图都说明了转换WAITINGRUNNABLE,而不是BLOCKED?红色描绘显示错误的过渡; 我错过了什么吗?

在此输入图像描述

java multithreading thread-state java-threads

28
推荐指数
1
解决办法
9820
查看次数

Java:嵌套的同步块

我在亨氏Kabutz的一看到这个Java的专家通讯版本,虽然其余的(事实上,所有)Kabutz博士的文章都是很好解释和详细,他似乎在掩饰什么这段代码是干什么的,或者更重要的是,它的意义是:

public class SomeObject {
    private Object lock1;
    private Object lock2;

    public void doSomething() {
        synchronized(lock1) {
            synchronized(lock2) {
                // ...
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

嵌套synchronized块的含义是什么?这对于尝试不同的线程doSomething()有何影响?

java concurrency multithreading

21
推荐指数
1
解决办法
2万
查看次数

以生产者/消费者模式暂停消费者

我有生产者和消费者联系BlockingQueue.

消费者从队列中等待记录并处理它:

Record r = mQueue.take();
process(r);
Run Code Online (Sandbox Code Playgroud)

我需要从其他线程暂停这个过程一段时间.怎么实现呢?

现在我认为实现它,但它似乎是不好的解决方案:

private Object mLock = new Object();
private boolean mLocked = false;

public void lock() {
    mLocked = true;
}

public void unlock() {
    mLocked = false;
    mLock.notify();

}

public void run() {
    ....
            Record r = mQueue.take();
            if (mLocked) {
                mLock.wait();
            }
            process(r);
}
Run Code Online (Sandbox Code Playgroud)

java multithreading producer-consumer blockingqueue

6
推荐指数
1
解决办法
238
查看次数