Bir Tamsayı değişkeni alıyorum ve iki iş parçacığıyla paylaşıyorum. Bir iş parçacığı, sayıları bile yazdırmalı ve bir iş parçacığı tek sayıyı sıralı olarak yazmalıdır. Ancak NotlegalMonitorStateException öğesini atarak notify().java bekle ve bildir
package mywaitnotifytest;
public class App {
public static void main(String[] args) {
Integer i=0;
Even even = new Even(i);
even.setName("EvenThread");
Odd odd = new Odd(i);
odd.setName("OddThread");
even.start();
odd.start();
}
}
class Even extends Thread{
Integer var;
Even(Integer var){
this.var=var;
}
@Override
public void run() {
while(true){
synchronized (var) {
if(var%2==0){
try {
var.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
var++;
System.out.println(Thread.currentThread().getName()+" "+var);
var.notify();
}
}
}
}
class Odd extends Thread{
Integer var;
Odd(Integer var){
this.var=var;
}
@Override
public void run() {
while(true){
synchronized (var) {
if(var%2!=0){
try {
var.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
var++;
System.out.println(Thread.currentThread().getName()+" "+var);
var.notify();
}
}
}
}
Ve çıktısı:
OddThread 1
Exception in thread "OddThread" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at mywaitnotifytest.Odd.run(App.java:67)
Bu soru farklı görünüyor. Ayrıca istisnanın sebebi oldukça farklıdır ve 'senkronize olmayan 'kod – ortis
ile ilgisi yoktur. Kilitlendiğiniz nesneye' notify() 'demiyorsunuz. Kısacası, değişken bir alanı kilitlemeyin. Değiştirdiğinizde değiştirirsiniz. Ayrıca, havuzlanmış bir nesneye kilitlenmeyin, çünkü 'Tamsayı' bunun kafa karıştırıcı sonuçları olacağından. –
Bekleyin ve senkronize edilmiş bloktan yalnızca –