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

标签 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. 有没有更短的方法来做到这一点?

最佳答案

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");

waitnotify 这样的低级事物实际上只是低级的 Java 特性,你不应该关心它们(除非你正在编写并发 API) .

此外,我建议阅读这本了不起的书:Java 并发实践

关于java - 在 Java 中同步 2 个线程的更简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7042762/

相关文章:

java - 从 JSON 数组中提取值

java - 线程莫名其妙的死掉了

java - @FunctionalInterface 如何影响 JVM 的运行时行为?

C 编程 - 线程,以及什么是 void (*func)(void*, unsigned long)

java - 如何解释 pstack 日志?

Java同步迭代器?

java - 使用 BlockingQueue 时是否需要额外的同步?

java - 在 Spring Hibernate 中操作 JSON 数组

c# - Try-Finally 与 Thread.BeginCriticalRegion

java - 同步计数器计数不正确