我正在尝试找出Java中的线程,并试图了解我得到的输出。我创建了3个类:发送者,接收者和消息框。
我正在尝试通过消息框将数据从发件人发送到收件人。当发送方发送数据时,它会打印“发送方放置元素”。一旦接收者得到一个元素,它就会打印“接收者得到一个元素”
问题是,在控制台中,我看到在发送方打印之前,收件人已打印出收件人已收到该元素。.>
发件人:
public class Sender implements Runnable { private MessageBox msgBox; public Sender(MessageBox m) { msgBox=m; } public void run() { Thread.currentThread().setName("Sender"); for(int i=0;i< 100;i++) { msgBox.put(i); System.out.println("Sender put element : " + i); try { long sleep_time = (long)(Math.random()*5000); //System.out.println("Sender going to sleep for " + sleep_time + " ms"); Thread.sleep(sleep_time); } catch (InterruptedException e) { e.printStackTrace(); } } } }
接收者:
public class Receiver implements Runnable{ private MessageBox<Integer> msgBox; public Receiver(MessageBox<Integer>m) { msgBox = m; } public void run() { Thread.currentThread().setName("Receiver"); while(true) { int element = msgBox.get(); System.out.println("Receiver got element : " + element); try { long sleep_time = (long)(Math.random()*5000); //System.out.println("Receiver going to sleep for " + sleep_time + " ms"); Thread.sleep(sleep_time); } catch (InterruptedException e) { e.printStackTrace(); } } } }
MessageBox:
import java.util.LinkedList; import java.util.Queue; public class MessageBox<E> { private Queue<E> msgQ; public MessageBox() { msgQ = new LinkedList<>(); } public synchronized void put(E i) { msgQ.add(i); notify(); System.out.println(Thread.currentThread().getName() + " : notifying other threads..."); } public synchronized E get() { if(msgQ.isEmpty()) { try { System.out.println(Thread.currentThread().getName() + " : waiting for new element.."); notify(); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return msgQ.remove(); } public boolean isEmpty() { return msgQ.isEmpty(); } }
main:
public class Main { public static void main(String[]args) { MessageBox msgBox = new MessageBox<Integer>(); Sender sender = new Sender(msgBox); Receiver receiver = new Receiver(msgBox); Thread t1 = new Thread(sender); Thread t2 = new Thread(receiver); t1.start(); t2.start(); } }
控制台:
Receiver : waiting for new element.. Sender : notifying other threads... Receiver got element : 0 Sender put element : 0 ....
此外,我是否需要在消息框中设置Q为volatile?
我正在尝试找出Java中的线程,并试图了解我得到的输出。我创建了3个类:发送者,接收者和消息框。我正在尝试通过消息框从...
从发送方类更新这样的打印语句
您的代码还可以。您看到的输出可能发生,因为插入到messageBox中并打印消息不是原子的。