【问题标题】:Threads and Multithreading in JavaJava中的线程和多线程
【发布时间】:2016-03-18 21:58:48
【问题描述】:

如果一个等待线程已经在等待notify 调用的块中等待,另一个等待线程如何进入同步块?

我已经用其他示例进行了测试,当其中一个线程处于同步块中并且新线程在旧线程离开块后立即进入同步块时,所有其他线程似乎都在等待进入同步块:

class ThreadClassNotifier implements Runnable {

private Message msg;

public ThreadClassNotifier(Message msg) {
    this.msg = msg;
}

@Override
public void run() {
    String name = Thread.currentThread().getName();
    System.out.println(name+" started");
    try {
        Thread.sleep(1000);
        synchronized (msg) {
            msg.setMsg(name+" Notifier work done");
            msg.notify();
            // msg.notifyAll();
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}

}

class ThreadClassWaiter implements Runnable {

private Message msg;

public ThreadClassWaiter(Message m){
    this.msg=m;
}

@Override
public void run() {
    String name = Thread.currentThread().getName();
    synchronized (msg) {
        try{
            System.out.println(name+" waiting to get notified at time:"+System.currentTimeMillis());
            Thread.sleep(10000);
            msg.wait();
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        System.out.println(name+" waiter thread got notified at time:"+System.currentTimeMillis());
        //process the message now
        System.out.println(name+" processed: "+msg.getMsg());
    }
}

}

public class ThreadMain {
    public static void main(String[] args) throws InterruptedException {
      Message msg = new Message("process it");
      ThreadClassWaiter waiter = new ThreadClassWaiter(msg);
      new Thread(waiter,"waiter").start();

      ThreadClassWaiter waiter1 = new ThreadClassWaiter(msg);
      new Thread(waiter1, "waiter1").start();
      System.out.println("All the threads are started");

  }

}

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    "怎么会有另一个等待线程进入同步块,if 已经有一个等待线程在该块中等待通知 打电话?”

    来自Object.wait() 的 java 文档

    当前线程必须拥有这个对象的监视器。 线程释放此监视器的所有权并等待,直到另一个线程通过调用 notify 方法或 notifyAll 方法通知在此对象的监视器上等待唤醒的线程。 然后线程等待,直到它可以重新获得监视器的所有权并恢复执行

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多