Producer-Consumer程序中的线程优先级-wait()和notify()

塞尔吉奥·格里什(Sergio Gliesh)

下面,我包括了Producer-Consumer程序(来自Java-《完整参考指南》第九版),它可能是许多人之间线程间通信的一个熟悉示例。

class Q {
     int n;
     boolean valueSet = false;

     synchronized int get() {
         while(!valueSet)
              try {
                  wait();
              } catch(InterruptedException e) {
                  System.out.println("InterruptedException caught");
              }
         valueSet = false;
         notify();
         return n;
    }

    synchronized void put(int n) {
        while(valueSet)
            try {
                wait();
            } catch(InterruptedException e) {
                System.out.println("InterruptedException caught");
            }
        this.n = n;
        valueSet = true;
        notify();
        }
}

class Producer implements Runnable {
    Q q;
    Producer(Q q) {
        this.q = q;
        new Thread(this, "Producer").start();
    }
    public void run() {
        int i = 0;
        while(true) {
            q.put(i++);
        }
    }
}

class Consumer implements Runnable {
     Q q;
     Consumer(Q q) {
         this.q = q;
         new Thread(this, "Consumer").start();
     }
     public void run() {
         while(true) {
             q.get();
         }
     }
}

class PC {
    public static void main(String args[]) {
        Q q = new Q();
        new Producer(q);
        new Consumer(q);
        System.out.println("Press Control-C to stop.");
    }
}

我想澄清为什么生产者在不返回消费者的情况下永远不能修改n两次。特别是在get里面notify();。行在返回n之前到达(当然,该方法必须以返回行结尾。)

但是,在get内部,为什么操作系统在notify()行之后返回n之前不能将锁授予Producer

叠生的

但是,为什么生产者线程无法理解这一点呢?在Consumer线程执行下一个返回n之前;行,就说一个核心系统?

因为这两种方法都是,synchronized并且只有一个线程可以一次执行它们。

对于您的情况,如果CPU在调用之后notify()和返回之前放弃了使用者线程n生产者将由于synchronized关键字而仍在等待获取锁定生产者在调用以后已经可以运行,notify但是直到使用者保持锁定状态才可以运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Java中的wait()和notify()的Producer Consumer Program

来自分类Dev

使用Java中的wait()和notify()的Producer Consumer Program

来自分类Dev

程序停止:wait()和notify()

来自分类Dev

Windows 7中的进程和线程优先级

来自分类Dev

ThreadPoolExecutor和Android的线程优先级

来自分类Dev

ThreadPoolExecutor和Android的线程优先级

来自分类Dev

Java中的wait()和notify()方法

来自分类Dev

使用信号量和pthread的Producer Consumer程序

来自分类Dev

Java线程中wait和notify方法的正确使用

来自分类Dev

线程调度优先级和良好性

来自分类Dev

Java-线程优先级和套接字

来自分类Dev

如何使用wait()和notify()正确暂停线程

来自分类Dev

对象如何与线程链接,以便wait()和notify()工作

来自分类Dev

为什么wait()和notify()不在特殊类中?

来自分类Dev

HibernateJPAVendorAdapter和JPAProperty中的属性之间的优先级

来自分类Dev

HibernateJPAVendorAdapter和JPAProperty中的属性之间的优先级

来自分类Dev

Haskell中的运算符和函数优先级

来自分类Dev

C ++模板中的类型优先级和整数类型

来自分类Dev

C ++中变量的范围和优先级

来自分类Dev

C中的短路和运算符优先级

来自分类Dev

OCaml中的@@和|>运算符优先级

来自分类Dev

在Chrome中执行fetch()和setTimeout()的优先级

来自分类Dev

C运算符中的优先级==和(=)

来自分类Dev

at.allow和at.deny优先级(在Ubuntu中)?

来自分类Dev

XMPP中的“优先级”和“资源”是什么?

来自分类Dev

bash和zsh中&& vs&的优先级

来自分类Dev

bash中管道(|)和逻辑与(&&)的优先级

来自分类Dev

Bash中stdin和stdout重定向的优先级

来自分类Dev

Bash中Heredocs和复合命令的优先级

Related 相关文章

热门标签

归档