The method notify() can only be called from within a synchronized method.

解决方案 »

  1.   

    schwarzenegger(找不到服务器) you mistaked,I think.
    It can be called in synchronized method or synchronized block.
      

  2.   

    好像你同步的对象有问题,把synchronized(lock)改成synchronized(this)肯定就没有问题了.
      

  3.   

    xiaohaiz(老土进城,两眼通红) ( ):
    改掉之后,的确运行成功了。
    能告诉我什么原因么?
      

  4.   

    这样也行
    public void run(){
    String ThreadName = Thread.currentThread().getName();
    if(ThreadName.equals("first")){
    try {
    synchronized(lock){
    lock.wait();
    for(int i = 0;i < 10;i ++){
    System.out.println("first executed");
    }
    }
    }
    catch (Exception ex) { }
    }else{
    synchronized(lock){
    for(int i = 0;i < 10;i ++){
    System.out.println("second executed");
    }
    lock.notify();
    }
    }
      

  5.   

    这样还行
    synchronized public void run(){
    String ThreadName = Thread.currentThread().getName();
    if(ThreadName.equals("first")){
    try {
    {
    wait();
    for(int i = 0;i < 10;i ++){
    System.out.println("first executed");
    }
    }
    }
    catch (Exception ex) { }
    }else{
    {
    for(int i = 0;i < 10;i ++){
    System.out.println("second executed");
    }
    notify();
    }
    }
      

  6.   

    sorry,没有看到楼主的回复。
    你把概念弄混绕了。
    对一个对象调用wait和notify方法必须要获得这个对象的锁。
    你原来的代码实际上同步在lock对象上,却wait在ThreadTest对象上。
    所以有两种修改方式:
    (1) 我刚才告诉你的方式,同步在ThreadTest对象上 synchronized(this);
    (2) 还是同步在lock上,调用lock对象的wait和notify方法,就像楼上的给你的解决一样:
        lock.wait();lock.notify();再重申一次:对一个对象调用wait和notify方法必须要获得这个对象的锁。
    你把两个对象混在一起了。
      

  7.   

    why? 因为线程在对wait() 和 notify() 调用时,  必须先要求取得object的锁占有状态
      

  8.   

    to kasanghyh (流浪的小狗) :
    看看,freelybird(阿愚) 和俺的意见都一致,问题也解决了,道理也说明白了。
    结帖吧。 :)
      

  9.   

    不好意思。如果以this作为锁的对象的话,我想问一下,创建两个线程时,使用的是相同的ThreadTest引用么? 为什么?
      

  10.   

    看看你的这两句:
    new Thread(this,"first").start();
    new Thread(this,"second").start();
    可不是都是一个this吗。:)
      

  11.   

    为什么改成这样就不行了呢?
    package test;public class ThreadTest implements Runnable{ public ThreadTest(){ }
    public void run(){
    String ThreadName = Thread.currentThread().getName();
    if(ThreadName.equalsIgnoreCase("first")){
    try {
    synchronized(this){
    wait();
    for(int i = 0;i < 10;i ++){
    System.out.println("first executed");
    }
    }
    }
    catch (Exception ex) { }
    }else{
    synchronized(this){
    for(int i = 0;i < 10;i ++){
    System.out.println("second executed");
    }
    notifyAll();
    }
    } }
    public static void main(String[] args){
    new Thread(new ThreadTest(),"first").start();
    new Thread(new ThreadTest(),"second").start();
    }}
      

  12.   

    再看看,这里:
    new Thread(new ThreadTest(),"first").start();
    new Thread(new ThreadTest(),"second").start();
    改了之后是两个new,是两个不同的对象了。
      

  13.   

    谢谢,我彻底明白了,谢谢大家,谢谢 xiaohaiz(老土进城,两眼通红),谢谢 freelybird(阿愚)