java - 如何实现Java线程之间的共享缓冲区?

标签 java multithreading shared producer-consumer

我打算在生产者和消费者线程之间编写一个共享缓冲区。这是我的代码:

class PQueue
{
    Token token;
    boolean flag = false;   // false: add, true: poll

    PQueue()
    {
        token = null;
    }

    synchronized void add(Token token)
    {
        if(flag == true)
        {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        flag = true;
        notify();
        this.token = token;
    }

    synchronized Token poll()
    {
        if(flag == false)
        {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        flag = false;
        notify();
        return this.token;
    }
}

我是多线程新手。是否存在潜在的并发错误?这是实现这一目标的“标准/通用”方式吗?或者有没有更简单、更有效的方法?

最佳答案

看看 java.util.concurrent 包,特别是 BlockingQueue 接口(interface)和实现它的类。这些用于将消息从一个线程传递到另一个线程。 SynchronousQueue 这正是您想要实现的。

您自己的实现有一些缺陷。其一,两个共享变量都应声明为 volatile以确保一个线程上的更改可以被另一个线程看到。还有你的if (flag == false)if (flag == true)测试实际上应该是 while循环,因为wait()可以wake up spuriouslynotify()实际上还没有被调用。

我建议将标记设置为 null 以指示没有对象,而不是使用单独的标志变量。而不是在InterruptedException面前捕捉、打印、盲目继续。 ,我建议让这两种方法在发生异常时都抛出该异常。这些是阻塞方法,调用者有责任处理阻塞方法被中断的可能性。

另外,我不知道你的 Token 是什么?类是,但队列中的任何内容实际上都不取决于其类型。定义一个通用的 PQueue<T> 会更有意义,然后使用PQueue<Token>如果你想传递 token 。

关于java - 如何实现Java线程之间的共享缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11946178/

相关文章:

Java - 数组和方法参数

c# - volatile 变量有用吗?如果是,那么什么时候?

ios - Xcode 4 iOS 项目结构问题

c - 使用信号量独立执行进程

java - 实用程序员的练习 26

java - 生成 Ant 构建文件

c# - 结果导致任务死锁

python - 如何使用 Python 多线程处理 MySQL 连接

php - 在同一个 apache 网络服务器中对多个域使用相同的 php 软件?

java - Java中如何组合路径?