我有以下情况..。有两个DJ正在尝试播放音乐,但很明显,只有当另一个DJ正在播放同一张CD时,他们才能播放CD,所以我有这些类,我试图使用同步锁定另一个线程的CD
public class cd {
private boolean played = false;
public void play() {
this.played = true;
Thread.sleep(2000);
}
//other methods, e.g. skip a song or put the CD back in the collection
public boolean isAvailable() {
return !(this.played);
}
}
public class turntable {
private boolean used = false;
public void use() {
this.played = true;
Thread.sleep(2000);
}
public boolean isFree() {
return !(this.used);
}
...
}DJ级:
public class DJ implements Runnable {
CD disk;
Turntable tt;
//constructor
public void run() {
//do something else, e.g. go to the bar
tt.use();
disk.play();
disk.skipSong();
disk.putBack();
tt.leave();
//do something else, e.g. smoke a cigarette
}
}现在,我试图阻止DJ_2的当前CD,而DJ_1则在这一部分中:
应阻止裁谈会的部分:
tt.use();
disk.play();
disk.skipSong();
disk.putBack();
tt.leave();但是如果DJ_1把它放回去,但现在正在抽一支烟的话,CD显然是可以买到的。
所以我的问题是..。如何只阻止线程运行方法的一部分,并将其设置为与不同线程的同一部分相关(请记住,im试图用同步方法解决问题)
发布于 2014-06-22 02:45:17
用于CD类中的播放方法
public synchronized void play() {
while(this.played) {
try {
wait();
} catch (InterruptedException e) {}
}
this.played = true;
// suppose each DJ can play the disk for 2 seconds and then has to yield the fun to others
Thread.sleep(2000);
this.played = false;
notifyAll();
}那么每个线程都应该有相同的CD实例。
public static void main(String){
CD cd = new CD();
DJ dj1 = new DJ();
dj1.disk = cd;
Thread threadDJ1 = new Thread(dj1);
DJ dj2 = new DJ();
dj2.disk = cd;
Thread threadDJ2 = new Thread(dj2);
threadDJ1.start();
threadDJ2.start();
}Java文档有关于这类主题防护块的很好的示例。
发布于 2014-06-22 02:27:32
synchronized可以放在对象上,而不仅仅是方法上。在应该阻止使用的部分
synchronized (tt) {
tt.use();
synchronized (disk) {
disk.play();
disk.skipSong();
disk.putBack();
}
tt.leave();
}在转盘和磁盘上的任何地方,sync按相同的顺序同步,否则死锁,音乐停止:)
https://stackoverflow.com/questions/24347433
复制相似问题