首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只等待另一个线程- Java的一部分

只等待另一个线程- Java的一部分
EN

Stack Overflow用户
提问于 2014-06-22 01:43:24
回答 2查看 74关注 0票数 0

我有以下情况..。有两个DJ正在尝试播放音乐,但很明显,只有当另一个DJ正在播放同一张CD时,他们才能播放CD,所以我有这些类,我试图使用同步锁定另一个线程的CD

代码语言:javascript
运行
复制
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级:

代码语言:javascript
运行
复制
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则在这一部分中:

应阻止裁谈会的部分:

代码语言:javascript
运行
复制
tt.use();    
disk.play();
disk.skipSong();
disk.putBack();
tt.leave();

但是如果DJ_1把它放回去,但现在正在抽一支烟的话,CD显然是可以买到的。

所以我的问题是..。如何只阻止线程运行方法的一部分,并将其设置为与不同线程的同一部分相关(请记住,im试图用同步方法解决问题)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-22 02:45:17

用于CD类中的播放方法

代码语言:javascript
运行
复制
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实例。

代码语言:javascript
运行
复制
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文档有关于这类主题防护块的很好的示例。

票数 0
EN

Stack Overflow用户

发布于 2014-06-22 02:27:32

synchronized可以放在对象上,而不仅仅是方法上。在应该阻止使用的部分

代码语言:javascript
运行
复制
synchronized (tt) {
    tt.use();    
    synchronized (disk) {
        disk.play();
        disk.skipSong();
        disk.putBack();
    }
    tt.leave();
}

在转盘和磁盘上的任何地方,sync按相同的顺序同步,否则死锁,音乐停止:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24347433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档