在Java中同步2个线程更简单的方法?

时间:2011-08-12 15:49:38

标签: java multithreading synchronization

我不确定在使用辅助线程执行某些代码之后,主线程中的某些代码将被执行。这就是我得到的:

    final Object lock = new Object();
    final Thread t = new Thread(new Runnable() {
        public void run() {
            synchronized(lock) {
                System.out.println("qwerty");
                lock.notify();
            }
        }
    });

    synchronized(lock) {
        t.start();
        lock.wait();
    }

    System.out.println("absolutely sure, qwerty is above");
  1. 这是正确的解决方案吗?
  2. 任何较短的方法都可以这样做吗?

4 个答案:

答案 0 :(得分:12)

notify() wait()之类的东西实际上是低级同步原语。

您应尽可能使用更高级别的抽象,例如, CountDownLatch

以下只是一个可以帮助您入门的示例(例如,此处未考虑超时问题):

    final CountDownLatch latch = new CountDownLatch(1);
    final Thread t = new Thread(new Runnable() {
        public void run() {
            System.out.println("qwerty");
            latch.countDown();
        }
    });

    t.start();
    latch.await();

    System.out.println("absolutely sure, qwerty as been printed");

等待 notify 之类的低级内容实际上只是您不应该关注的低级Java特性(除非您正在编写并发API)

此外,我建议阅读这本神奇的书: Java Concurrency In Practice

答案 1 :(得分:5)

假设您的主线程需要启动辅助线程的处理,Exchanger将是最简单的解决方案。

如果辅助线程是独立的,那么某种形式的BlockingQueue是合适的。


使用Exchanger的示例(具有适当的异常处理)。一个交换器可以用两个队列代替。

public static void main(String[] argv)
throws Exception
{
    final Exchanger<String> exchanger = new Exchanger<String>();
    new Thread(new Runnable() 
    {
        @Override
        public void run() 
        {
            try
            {
                String s = exchanger.exchange("");
                System.out.println(s);
                exchanger.exchange("this came from subthread");
            }
            catch (InterruptedException ex)
            {
                System.out.println("interrupted while waiting for message");
            }
        }
    }).start();

    exchanger.exchange("this came from main thread");
    String s = exchanger.exchange("");
    System.out.println(s);
}

答案 2 :(得分:-1)

final Thread t = new Thread(new Runnable() {
    public void run() {
        System.out.println("qwerty");
    }
});

t.start();
t.join();

System.out.println("absolutely sure, qwerty is above");

答案 3 :(得分:-4)

您提供的代码的最佳解决方案是:

System.out.println("qwerty");
System.out.println("absolutely sure, qwerty is above");

不需要时请勿使用线程。

但是如果你知道你在线程中做了什么,那么@ DoubleMalt的解决方案是可行的方法(t.join())。

你也可能觉得值得一读http://download.oracle.com/javase/tutorial/essential/concurrency/