代码之家  ›  专栏  ›  技术社区  ›  MWO

Java wait()通知()

  •  0
  • MWO  · 技术社区  · 8 年前

    我有以下代码:

    public class ThreadA {
    public static void main(String[] args){
        ThreadB b = new ThreadB();
        b.start();
    
        synchronized(b){
            try{
                b.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }}
    
    
    class ThreadB extends Thread{
    @Override
    public void run(){
        synchronized(this){
            notify();
        }
    }}
    

    我对wait/notifyThreads很陌生,我需要找到一种方法,在线程B的notify()之前等待,直到我从另一个类显式调用它,最好先从测试用例调用,然后从分离的web服务类调用。我不明白,你能帮帮我吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   Justin Thomas    8 年前
    import java.lang.InterruptedException;
    
    public class ThreadRunner {
        public static void main(String[] args){
            ThreadA a = new ThreadA();
            ThreadB b = new ThreadB(a);
    
            b.start();
            try {
                Thread.sleep(1000);
            } catch(InterruptedException e) {}
    
        }
    }
    
    class ThreadA extends Thread {
        String name = "threadA";
    
        public void run() {
            try {
                synchronized (this) {
                    wait();
                }
                System.out.println(name + " " + "notified!");
            } catch(InterruptedException e) {
               // TODO: something
            }
        }
    }
    
    class ThreadB extends Thread {
        ThreadA a;
        String name = "threadB";
    
        public ThreadB(ThreadA a) {
            this.a = a;
        }
    
        @Override
        public void run(){
    
            a.start();
            try {
                Thread.sleep(1000);
            } catch(InterruptedException e) {}
            synchronized (a) {
                System.out.println(name + " " + "trying to notify A!");
                a.notify();
            }
    
        }
    }
    
        2
  •  0
  •   Maxim Blumental    8 年前

    如果要等待任务完成,我建议使用Java并发API方式:

    public class WaitATaskExample {
      public static void main(String[] args) {
        ExecutorService service = null;
        try {
          service = Executors.newSingleThreadExecutor();
          Future<?> future = service.submit(() -> {
            // your task here
            Thread.sleep(5000);
            return null;
          });
          try {
            future.get(); // blocking call
          } catch (InterruptedException | ExecutionException e) {
            // handle exceptions
          }
        } finally {
          if (service != null) {
            service.shutdown();
          }
        }
      }
    }
    

    另一种方法使用 CountDownLatch :

    public class WaitATaskExample {
      public static void main(String[] args) {
        ExecutorService service = null;
        try {
          service = Executors.newFixedThreadPool(2);
          CountDownLatch latch = new CountDownLatch(1);
    
          Callable<Object> waitingTask = () -> {
            latch.await(); // wait
            return null;
          };
          Callable<Object> notifier = () -> {
            Thread.sleep(2_000);
            latch.countDown(); // notify
            return null;
          };
    
          service.submit(waitingTask);
          service.submit(notifier);
        } finally {
          if (service != null) {
            service.shutdown();
          }
        }
      }
    }
    
    推荐文章