java - 在并发类的 run() 方法中放置什么?

标签 java multithreading concurrency

假设我们有一个名为 Teacher 的线程安全类,它实现了 Runnable。教师可以阅读或写入学生的书本。

public class Teacher implements Runnable {

boolean doneWithBook = false;
private Lock lock = new ReentrantLock();
private Condition cond = lock.newCondition();

public void readBook(Book book) {

    lock.lock();
    try {
        book.read();
        doneWithBook = false;
        cond.signalAll();
        System.out.println("Teacher read the book");
    } finally {
        lock.unlock();
    }
}

public void writeToBook(Book book) {

    lock.lock();
    try {
        book.write();
        doneWithBook = true;
        System.out.println("Teacher wrote to book.");
    } finally {
        lock.unlock();
    }
}

Teacher 实现了 Runnable,因此任务可以在其自己的单独线程上运行。我不明白的是要在 Runnable 的接口(interface) run() 方法中放入什么。如果我想读/写这本书怎么办? run() 如何发挥作用?非常感谢示例。

@Override
public void run() {

  // now what???

}

最佳答案

好的,一般而言,您的任务实现了Runnable,因此在您的情况下,您可能会遇到以下情况:

public ReadTask implements Runnable
{
  private Teacher teacher;

  public ReadTask(Teacher teacher)
  {
    this.teacher = teacher;
  }

  public void run()
  {
    teacher.readBook();
  }
}

public WriteTask implements Runnable
{
  private Teacher teacher;

  public WriteTask (Teacher teacher)
  {
    this.teacher = teacher;
  }

  public void run()
  {
    teacher.writeToBook();
  }
}

然后你的调用代码将如下所示:

Teacher teacher = ...
new Thread(new ReadTask(teacher)).start();
new Thread(new WriteTask(teacher)).start();

另请注意,代码中的条件并没有真正实现任何目标。

关于java - 在并发类的 run() 方法中放置什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22614284/

相关文章:

java - 如何使用 ant 构建需要外部 jar 的小程序?

c# - C#LazyCache并发字典垃圾回收

java - java中异步进程的技术和设计

c++ - 有原子 lambda 表达式吗?

Java字符串加密

java - 如何将 Hibernate 与映射到不同数据库的自定义字段类型一起使用?

java - 为什么Java源码中的InetAddress.isSiteLocalAddress()总是返回false

python - Python-调用函数和继续的主程序

java - ArrayList 上的 ConcurrentModificationException

java - Java 中 wait() 和 notifyAll() 的行为?