Решить проблему IllegalMonitorException в потоке?

#java #synchronization

#java #синхронизация

Вопрос:

У меня есть следующие коды. Он выдает мне java.lang.Исключение IllegalMonitorStateException. Почему это так и как мне это решить?

 public class Threads  {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //Thread Th = new Threads();
        Thread th = new Thread (new thread1 ());
        th.start();
        Thread th1 = new Thread (new thread1 ());
        th1.start();
    }
}



class thread1 implements Runnable{
    String name = "vimal";
    static int id = 0;
    public void run() {
        System.out.println("Runnable " this.name);
        //setNAme("Manish");
        synchronized(name){
            System.out.println(this.name);
            this.name = "Manish " this.id;
            this.id  ;
            try {
                wait(1000);System.out.println("Thread " Thread.currentThread().getName());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        }
    }

    public synchronized void setNAme(String name){
        try {
            System.out.println("Thread " Thread.currentThread().getName());
            wait(1000);
            this.name = name;
            System.out.println("Name " this.name);

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }   



}
  

Комментарии:

1. Попробуйте опубликовать фактическую трассировку стека. Вы также должны проверить ответы на свой предыдущий вопрос, прежде чем задавать дополнительные вопросы, связанные с потоковой обработкой.

Ответ №1:

вы вызываете wait(1000), не удерживая монитор на «этом» объекте в методе run(). проверьте javadoc на предмет Object.wait():

http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#wait ()

Если вы просто хотите задержку в 1 секунду — вам следует использовать Thread.sleep (1000).

Ответ №2:

Прошу прощения за немного поздний ответ, но вы можете попробовать это

 public class Threads  {
/**
 * @param args
 */
public static void main(String[] args) {
    //Thread Th = new Threads();
    Thread th = new Thread (new thread1 ());
    th.start();
    Thread th1 = new Thread (new thread1 ());
    th1.start();
}
}

class ThreadSample implements Runnable {
String name = "vimal";
static int id = 0;

public void run() {
    System.out.println("Runnable "   this.name);
    // setNAme("Manish");
    synchronized (this) {
        System.out.println(this.name);
        this.name = "Manish "   this.id;
        this.id  ;
        try {
            wait();
            System.out
                    .println("Thread "   Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public synchronized void setName(String name) {
    try {
        System.out.println("Thread "   Thread.currentThread().getName());
        wait(1000);
        this.name = name;
        System.out.println("Name "   this.name);

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}
  

Я действительно не знаю, как вы хотите, чтобы это выполнялось, но вы устанавливали блокировку на строку и вызывали wait () поверх «this», что и вызвало у вас исключение.