#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», что и вызвало у вас исключение.