【问题标题】:Threaded clock object线程时钟对象
【发布时间】:2019-06-02 00:00:38
【问题描述】:

我正在开发一个所有其他对象都可以看到的线程“时钟”。每个时间周期对应于时钟的一个滴答,时钟会增加一个计数器。然后它将为其他类提供一个公共方法来读取当前时间。 1 个滴答代表 5 秒的模拟时间,但只需要 1 秒。这是我到目前为止实现的内容:

  public class Clock extends Thread

{
    private int seconds = 0;


    public void run()
    {
        //sleep 1000 mil secs
        this.seconds += 5;
    }



}

我想收到一些关于向其他类提供当前时间的方法的反馈。这是我到目前为止在另一个将使用该方法的类上所做的示例:

public class Entry extends Thread
{

    Clock c;

    public Entry(Clock clock)
    {

        c = clock;
    }

【问题讨论】:

  • 告诉我们您要解决的问题。了解您想要实现的目标有助于我们提供更好的答案。
  • 入口类会产生汽车对象,所以我希望每次汽车进入城镇时都给它一个当前时间的时间戳。
  • 需要计时器线程似乎毫无意义且容易出错。取而代之的是,记录程序的开始时间,得到一个差值并将其乘以 5。您可以从实用程序类的静态方法中提供时间。
  • 为什么不用 System.currenttimeMillis() 方法?

标签: java multithreading


【解决方案1】:

这种设计可能很好,也可能被破坏,但这一切都取决于我们无法从这里看到的细节,包括您的其余代码以及您想要实现的目标。

我会考虑:

  • 您可能需要使时间更加线程安全,例如将其标记为volatile 或者在synchronized 块中访问它(例如synchronized getter 方法)
  • 您可以将 System.currenttimeMillis() 乘以 5,而不是“Clock.run”中的自旋循环,但这取决于您要实现的目标

我认为这个问题在 Stackoverflow 上并不适用——目前还没有一个正确答案。

我认为您的代码是一个不错的开始。为什么不尝试这种方法,看看你的进展如何,然后根据你的经验进行更新呢?这样做可能会比尝试在此处设计它更快。

【讨论】:

    【解决方案2】:

    创建seconds 字段volatile(这是您可以使用的最低限度的同步原语)。原因是编译器可能会将此字段缓存在本地寄存器中,否则其他线程会读取此变量可能会读取一个陈旧的值。

    这是一个很好的例子,说明了为什么需要同步。即使只有并发读取而没有并发写入,您的状态也是如此。

    编辑:正如其他人所提到的,您的设计很糟糕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-26
      • 2014-12-01
      • 1970-01-01
      • 2016-06-06
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多