同步两个彼此不认识的线程[Java]

时间:2014-12-30 02:30:03

标签: java multithreading synchronize

首先,请原谅我可怜的英语= S第二,对不起,如果我的标题有点奇怪,我不知道如何更好地表达它。

我有点问题。我正在开发一个Java游戏,我正在按照它的方式使用MVC模式。我不知道这是否是最有效的方式,但无论如何,总的来说: 4个包:model,view,controler和“observer”。

在观察者中,有一个接口“Observer”,其中定义了“观察模型”元素应该实现的所有方法。还有一个“Observable”类,带有一个观察者列表,以及通知它们一些变化的所有方法(像“fireEvent1(int i){for(Observer obs:observers)obs.Event1(i);}”这样的方法) 该模型扩展了Observable类,GUI的一些元素实现了Observer接口。

现在我的问题是:在模型中的方法中,我希望模型“等待”2个用户交互。这意味着:

  • 模型中调用的方法
  • 做一些事情
  • 等待用户第一次进行互动
  • 获取有关用户刚刚做了什么的信息(在控制器中收集的信息)
  • 做一些事情
  • 等待用户第二次进行互动
  • 获取信息
  • 做东西

一个精度:在实现ActionListener的控制器中收集用户的交互,并且视图的元素将控制器作为ActionListener。

所以我想我必须使用线程,但尽管我找到了所有教程和例子,但我仍然无法完成这项工作。我试图在模型中启动一个线程,让它等待,但我无法在控制器中创建另一个线程,与第一个线程同步并在必要时通知它。我甚至不知道这是否是正确的做法,无论如何,我已经解决了这个问题几个小时,我只是不知道如何解决它。

我希望我的解释清楚,如果没有,请随意提问,然后我会尝试写一个代表我问题的简单代码。

感谢您的帮助

Scentle5S

编辑: 这是一个代表我的问题的小代码。所以我希望模型能够从视图中获取信息,一个接一个,只有两次。我在模型中启动一个线程并让它等待(顺便说一句,我看到很多次无限循环使线程等待,但我不明白为什么它是必要的。不会简单的调用wait() ,没有循环,也做这个工作?)。

但很明显,此处没有其他线程与模型同步,该模型能够在执行操作时通知并传输数据。

我不知道怎么做这样的事情。

public class Model extends Observable {

    public void waitForActions() {
        System.out.println("Wating for two user's actions");

        Thread t = new Thread() {
            public void run() {
                while (true) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                    }
                }
                System.out.println("First action received in model : "
                        + message);
                while (true) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                    }
                }
                System.out.println("Second action received in model : "
                        + message);
            }
        };
        fireWaitForActions(true);
        t.start();
        fireWaitForActions(false);
    }
}

public class Controler implements ActionListener {
    private Model model;

    public Controler(Model model) {
        this.model = model;
    }

    public void actionPerformed(ActionEvent e) {
        String message = ((JButton)e.getSource()).getText();
        System.out.println("Action received in controler : "+message);
    }
}

public class View extends JFrame implements Observer {
    private JButton b1 = new JButton("Action 1");
    private JButton b2 = new JButton("Action 2");
    private Controler controler;

    public View(Controler controler) {
        this.controler = controler;

        b1.addActionListener(controler);
        b2.addActionListener(controler);

        b1.setEnabled(false);
        b2.setEnabled(false);

        JPanel container = new JPanel();
        container.add(b1);
        container.add(b2);
        setContentPane(container);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public void waitForActions(Boolean b) {
        b1.setEnabled(b);
        b2.setEnabled(b);       
    }
}

public static void main(String[] args) {
    Model model = new Model();
    Controler controler = new Controler(model);
    View view = new View(controler);
    model.addObserver(view);
    model.waitForActions();
}

以下是Observable和Observer classe / interface:

public class Observable {
    private LinkedList<Observer> observers = new LinkedList<Observer>();

    public void addObserver(Observer obs) {
        observers.add(obs);
    }

    public void fireWaitForActions(boolean b) {
        for (Observer obs: observers) obs.waitForActions(b);
    }
}

public interface Observer {
    public void waitForActions(Boolean b);
}

3 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。查看Java语言手册中的线程同步方法。

您可以对两个线程都可以看到的Object使用wait()和notify()。 您可以在两个线程都可以看到的信号量上使用acquire()和release()。 您可以使用阻塞队列构建解决方案。

wait()/ notify()或acquire()/ release()可能最简单。

答案 1 :(得分:0)

要同步两个(或多个线程)无法相互了解,您需要两个线程共有的对象。您可以轻松使用

中的锁定
java.util.concurrent.locks

包。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/package-summary.html

例如,创建一个ReentranceLock并简单地使用

.lock()

.unlock()

答案 2 :(得分:0)

我认为你或你误解了自己的要求会引起一些令人困惑的解释。每当有一个请求进入您的Web容器时,它将创建一个用于处理该srequest的线程。你在谈论那些线索还是你能解释你想要在细节中满足的要求是什么?