使用两个线程按顺序调用两个不同的函数时通知/等待问题

时间:2015-10-19 17:32:59

标签: java multithreading synchronization

我在同一个对象上同步函数时遇到问题。在我的主类中,我有一个按钮,按下时,应该从不同的类顺序触发两个函数。第一个线程运行正常。我想第二个陷入困境,但是如何陷入困境。但是,当我为第二个线程指定超时时,它会触发。有人可以帮我理解通知/等待发生了什么吗?

public void actionPerformed(ActionEvent ae)
    {
        t = new Thread () 
        {
            public void run ()
            {
                synchronized(this)
                {
                    one();
                    notify();
                }
            }
        };
        thr = new Thread () 
        {
             public void run ()
             {
                 synchronized (this)
                 {
                    try
                    {
                        wait();
                        two();
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                 }
             }
         };
        thr.start();
        t.start();
    }

2 个答案:

答案 0 :(得分:2)

  

我在同一个对象上同步函数时遇到问题

问题是您没有在同一个对象/锁上进行同步,因为this中每个synchronized(this)都指的是Thread的不同实例:

  • 来自t
  • 的一个
  • 来自thr
  • 的一个

要避免此类问题,请创建显式的锁定对象,然后将其传递给您的主题。

答案 1 :(得分:1)

竞争条件是t还是thr首先进入同步部分。在等待之前,我们可以通知。