Am Я не использую синхронизации правильно:Java Синхронизация -IllegalMonitorStateException
В следующий код у меня возникли 2 проблемы:
1. в то время как makingmethods (designBusiness, createBusiness, sellBusiness), как synchronized
, как в этом случае, вызов wait()
говорит IllegalMonitorStateException
, но я не понимаю, почему? потому что в designBusiness
метод Designer Thread
действительно получить замок, поэтому он должен ждать по телефону wait
. Я получаю IllegalMonitorStateException на wait()
и notify()
оба.
2.Even, хотя, когда я удалить synchronized
ключевое слово и использовать synchronized(this)
блок для особо wait()
и notify()
еще я получил ТУПИК! ЗАЧЕМ?
public class Main {
HashMap<String, Integer> map = new shop().orderBook();
public static void main(String[] args) throws InterruptedException {
Main main = new Main();
main.sellBusiness();
Thread.sleep(3000);
main.designBusiness();
Thread.sleep(3000);
main.createBusiness();
}
private synchronized void designBusiness() throws InterruptedException {
Thread designThread = new Thread(new Runnable() {
public void run() {
Set set = map.keySet();
System.out.println("Tracking OrderList");
System.out.println(set.size());
try {
System.out.println("waiting.........");
wait();
System.out.println("wait completed");
System.out.println("after design process items in orderList are "
+ map.keySet().size());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Designer Thread");
designThread.start();
System.out
.println("status of Designer Thread" + designThread.isAlive());
}
private synchronized void createBusiness() throws InterruptedException {
Thread createThread = new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName()
+ " started");
Creator creator = new Creator();
creator.create(map);
notifyAll();
System.out.println("notified");
}
}, "Creator Thread");
createThread.start();
createThread.join();
System.out.println("status of Creator Thread" + createThread.isAlive());
}
private void sellBusiness() throws InterruptedException {
Thread sellThread = new Thread(new Runnable() {
public void run() {
Seller seller = new Seller();
seller.sellGold(45000, 15);
seller.sellSilver(14000, 60);
seller.noteOrder("Mrs Johnson", 15000, map);
seller.noteOrder("Mr. Sharma", 10000, map);
seller.sellGold(60000, 20);
seller.noteOrder("Mr. Hooda", 17500, map);
System.out.println(Thread.currentThread().getName()
+ " done selling");
}
}, "Seller Thread");
sellThread.start();
sellThread.join();
System.out.println("status of seller Thread" + sellThread.isAlive());
}
}
, пожалуйста, помогите, я не смог найти решение этой проблемы, и я ищу от прошлой ночи.
DEADLOCK? Какие потоки заблокированы? главный и дизайнер и создатель? – johnchen902
@ johnchen902 тупик из-за дизайнера и создателя. Я не думаю, что это была причина. –