线程时钟对象

时间:2019-01-07 10:17:52

标签: java multithreading

我正在使用所有其他对象都可以看到的带螺纹的“时钟”。每个对应于时钟滴答的时间段,时钟都会增加一个计数器。然后它将为其他类提供一个公共方法来读取当前时间。 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;
    }

2 个答案:

答案 0 :(得分:0)

使seconds字段volatile(这是您可以使用的最基本的最小同步原语)。原因是编译器可能将此字段缓存在本地寄存器中,而另一个读取此变量的线程可能会读取过时的值。

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

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

答案 1 :(得分:0)

这种设计可能很好,或者可能被破坏了,但这全都取决于我们在这里看不到的细节,包括您的其余代码以及您要实现的目标。

我会考虑:

  • 您可能需要花更多的时间来确保线程安全,例如将其标记为volatile或在synchronized块中进行访问(例如synchronized getter方法)
  • 您可以将Clock.run乘以5,而不是在“ System.currenttimeMillis()”内部进行旋转,但这取决于您要实现的目标

我不认为这个问题真正适用于Stackoverflow-尚无一个正确答案。

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