Y
yk
HI there,I ran into a really weird problem today,I wrote the code when
I'm trying to get my Producer-Consumer-model running.
I got the running error exception like this:
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Lock$Increaser.run(Lock.java:22)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Lock$Decreaser.run(Lock.java:39)
Seems like is the Integer class that caused the weird problem,can
anyone tell me how this happens,maybe the autoboxing or something
else?
public class Lock{
Integer i=new Integer("3");
Increaser in=new Increaser();
Decreaser de=new Decreaser();
public static void main(String[] args){
Lock l=new Lock();
l.in.start();
l.de.start();
}
class Increaser extends Thread{
public void run(){
while(true){
synchronized(i){
if(i>10){
try{
i.wait();
}catch(InterruptedException e){
}
System.out.println("increaser waiting");
}
i++;
i.notify();
}
}
}
}
class Decreaser extends Thread{
public void run(){
while(true){
synchronized(i){
if(i<=0){
try{
i.wait();
}catch(InterruptedException e){
}
System.out.println("decreaser waiting");
}
i--;
i.notify();
}
}
}
}
}
I'm trying to get my Producer-Consumer-model running.
I got the running error exception like this:
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Lock$Increaser.run(Lock.java:22)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Lock$Decreaser.run(Lock.java:39)
Seems like is the Integer class that caused the weird problem,can
anyone tell me how this happens,maybe the autoboxing or something
else?
public class Lock{
Integer i=new Integer("3");
Increaser in=new Increaser();
Decreaser de=new Decreaser();
public static void main(String[] args){
Lock l=new Lock();
l.in.start();
l.de.start();
}
class Increaser extends Thread{
public void run(){
while(true){
synchronized(i){
if(i>10){
try{
i.wait();
}catch(InterruptedException e){
}
System.out.println("increaser waiting");
}
i++;
i.notify();
}
}
}
}
class Decreaser extends Thread{
public void run(){
while(true){
synchronized(i){
if(i<=0){
try{
i.wait();
}catch(InterruptedException e){
}
System.out.println("decreaser waiting");
}
i--;
i.notify();
}
}
}
}
}