线程问题-收件人在发件人之前打印

问题描述 投票:0回答:2

我正在尝试找出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个类:发送者,接收者和消息框。我正在尝试通过消息框从...

java multithreading
2个回答
0
投票

从发送方类更新这样的打印语句


0
投票

您的代码还可以。您看到的输出可能发生,因为插入到messageBox中并打印消息不是原子的。

© www.soinside.com 2019 - 2024. All rights reserved.