我是JAVA新手,在JAVA中學習多線程。這是我的代碼片段。瞭解JAVA中的同步方法
import java.util.*;
import java.lang.*;
import java.io.*;
class Manager {
static final int MAXQUEUE = 5;
private Vector messages = new Vector();
public synchronized void putMessage() throws InterruptedException {
while (messages.size() == MAXQUEUE) {
System.out.println("waiting for space in queue ");
wait();
}
messages.addElement(new java.util.Date().toString());
System.out.println("created a new message and message count is " + messages.size());
notify();
}
public synchronized String getMessage() throws InterruptedException {
notify();
while (messages.size() == 0) {
System.out.println("queue is empty ");
wait();
}
String message = (String) messages.firstElement();
messages.removeElement(message);
System.out.println("removed a message and message count is " + messages.size());
return message;
}
}
class Producer extends Thread {
Manager myRef;
Producer(Manager ref) {
myRef = ref;
}
public void run() {
try {
while (true) {
myRef.putMessage();
sleep(1000);
}
} catch (InterruptedException e) {
}
}
}
class Consumer extends Thread {
Manager myRef;
Consumer(Manager ref) {
myRef = ref;
}
public void run() {
try {
while (true) {
String message = myRef.getMessage();
System.out.println("Got message: " + message);
sleep(2000);
}
} catch (InterruptedException e) {
}
}
public static void main(String args[]) {
Manager ref = new Manager();
Producer producer = new Producer(ref);
producer.start();
new Consumer(ref).start();
}
}
什麼我期待:
- 首先我的生產者線程將管理對象的鎖的控制。它會調用putMessage(),直到count爲5並釋放鎖。
- 現在消費者線程將取得鎖定並開始讀取消息,直到列表爲空,然後它將釋放鎖定。 這個序列將繼續。
但是,發生了什麼:
created a new message and message count is 1
removed a message and message count is 0
Got message: Thu Aug 13 07:26:45 GMT 2015
created a new message and message count is 1
removed a message and message count is 0
Got message: Thu Aug 13 07:26:46 GMT 2015
and so on.....
正如你看到的,我的消費線程能夠調用readMessage(),即使經理對象的鎖是生產者線程這是執行putMessage()。如果一個線程正在執行實例方法,那麼其他線程如何能夠調用另一個實例方法?
請糾正我的理解。
載體???????? – aviad
嘗試閱讀關於多線程如何工作的一些閱讀。你在方法上同步,但這不會阻止你的消息對象的問題。 – aviad
我在輸出中看不到問題。消息被添加,然後刪除,然後添加另一條消息,然後刪除。是什麼讓你認爲兩個線程同時運行同步方法? – immibis