我目前正在研究多线程编程,我很难掌握线程之间的共享资源。
我有两个共享资源time
和alarm
我有三个主题,一个每秒更新time
,一个监视time
对alarm
,最后一个根据用户请求更改time
和alarm
。
这是使用互斥信号量完成的,我有一个简单的设置如下所述:
Main
线程,程序从这里开始,主机time
和alarm
公共变量并实例化子线程。 Tick
子线程,每1000毫秒休眠一次,然后修改Mother
线程的time
变量UserInput
子线程被阻止,直到捕获到用户输入为止,并在time
主题中修改alarm
或Main
。Alarm
子线程,每1000毫秒休眠一次,alarm
== time
Main
线程为每个资源保留一个互斥锁,因此一次只能有一个线程访问它。
这样的设计是否合理还是我只是过于复杂化了?
答案 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);
}
}