【问题标题】:How can multiple threads maintain reference to an instance?多个线程如何维护对实例的引用?
【发布时间】:2017-10-24 03:06:23
【问题描述】:

客户端会看到一个名为Scheduler 的类,它会在特定时间间隔安排警报。为此,我在类中有一个方法setAlarm,它将警报添加到优先队列并执行notify() 以让Timer 过程知道是时候唤醒并处理队列顶部的内容了。

下面是一个基本实现的例子-

class Scheduler {

    synchronized public void setAlarm(Date date) {
        notify();
    }

    synchronized private void alarmTimer() {
        while (true) {
             wait();
             System.out.println("Alarm Triggered");
        }
    }

现在我需要Timer 过程在另一个线程上运行,因为它会一直等到收到通知或时间到了。但是客户端应该不知道有两个线程。就客户端而言,它只会做一个schedulerInstance.setAlarm(myDate),它应该被处理。

所以Scheduler 必须为alarmTimer() 创建一个单独的线程。我如何在仍然引用正确的this 对象的同时从这个新线程调用alarmTimer?处理我希望多个线程保持对原始 Scheduler 实例的引用以便 wait()notify() 工作的情况的正确方法是什么?

【问题讨论】:

标签: java multithreading synchronization this


【解决方案1】:

这是一种方法:

  1. 扩展线程
  2. 同步而不是在this 上而不是在方法级别上
  3. 开始您的话题并在this 上保留您的参考...

 class Scheduler extends java.lang.Thread {

  public void setAlarm(Date date) {
    synchronized(this) {
      this.notify();
    }
  }

  private void alarmTimer() {
    this.start();
  }

  @Override
  public void run() {
    synchronized(this) {
      while (true) {
         this.wait();
         System.out.println("Alarm Triggered");
      }
    }
  }
}

所有其他方法都是可以考虑的,您可以在警报开始和停止之间保留对等待对象的引用。 (anyObject.wait()anyObject.notify()

【讨论】:

  • 扩展线程不是坏习惯吗?不推荐使用ThreadPoolExecutor的方法吗?
  • @sbhatla :不,这是“不是那么糟糕的做法”(..扩展线程......因为在许多教程/在学校教过)。 ThreadPoolExecutor 与扩展 Thread 没有冲突,但它是一个(适当的)“容器”来执行和管理(多个)线程。
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多