1

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

我有两个共享资源,time并且alarm

我有三个线程,一个time每秒不断更新,一个监控timealarm最后一个根据用户请求time进行更改alarm

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

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

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

这样的设计是合理的还是我只是把事情复杂化了?

4

2 回答 2

2

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

其次,您对“互斥锁”的含义不是很清楚,因为这不是 Java 语言规范定义的术语。如果您的意思是java.util.concurrent包中的某些内容,例如Semaphore,这将是矫枉过正;如果您只是Object指用作锁的普通 Java 实例,那将是一种简单直接的方法。但是请注意,您根本不需要任何锁定:对于两个时间戳值,volatile变量就足够了,或者最多AtomicLongs(或您使用的任何类型),因此您可以原子地更新它们。

于 2012-10-13T17:51:00.310 回答
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);
   }
}
于 2012-10-13T17:00:39.230 回答