一个简单的多线程闹钟

时间:2012-10-13 16:57:49

标签: java multithreading concurrency semaphore

我目前正在研究多线程编程,我很难掌握线程之间的共享资源。

我有两个共享资源timealarm

我有三个主题,一个每秒更新time,一个监视timealarm,最后一个根据用户请求更改timealarm

这是使用互斥信号量完成的,我有一个简单的设置如下所述:

  1. Main线程,程序从这里开始,主机timealarm公共变量并实例化子线程。
  2. Tick子线程,每1000毫秒休眠一次,然后修改Mother线程的time变量
  3. UserInput子线程被阻止,直到捕获到用户输入为止,并在time主题中修改alarmMain
  4. Alarm子线程,每1000毫秒休眠一次,alarm == time
  5. 时关闭

    Main线程为每个资源保留一个互斥锁,因此一次只能有一个线程访问它。

    这样的设计是否合理还是我只是过于复杂化了?

2 个答案:

答案 0 :(得分:2)

我的第一个评论是关于您使用的语言,这可能表明您有一些误解。线程不拥有任何变量;这可能意味着您已声明了Thread的多个自定义子类。如果是这样,这将不是一个明智的方法。请注意,Thread只是类的名称,它不是实际的线程 - 与File不是文件的方式完全相同。你没有发布任何代码所以我必须求助于猜测,但如果我所描述的是真的那么你应该重新设计。使用普通类(不包含任何子类)并使用Thread实例化Runnable

其次,由于这不是Java语言规范定义的术语,因此“mutex”所暗示的内容并不十分清楚。如果您指的是java.util.concurrent包中的内容,例如Semaphore,那就太过分了;如果你的意思是只用作锁的普通Java Object实例,那将是一种简单而直接的方法。但是请注意,您根本不需要任何锁定:volatile变量就足够了,或者最多只有AtomicLong s(或者您使用的任何类型)两个时间戳值,所以你可以原子地更新它们。

答案 1 :(得分:1)

我猜你可以简单地使用ScheduledExecutorService

这是一个带有方法的类,该方法将ScheduledExecutorService设置为每隔十秒钟发出一小时的哔声:

import static java.util.concurrent.TimeUnit.*;
class BeeperControl {
private final ScheduledExecutorService scheduler = 
   Executors.newScheduledThreadPool(1);

public void beepForAnHour() {
    final Runnable beeper = new Runnable() {
            public void run() { System.out.println("beep"); }
        };
    final ScheduledFuture<?> beeperHandle = 
        scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
    scheduler.schedule(new Runnable() {
            public void run() { beeperHandle.cancel(true); }
        }, 60 * 60, SECONDS);
   }
}