Java 生产者/消费者多线程代码未按预期工作

Java 生产者/消费者多线程代码未按预期工作,java,multithreading,Java,Multithreading,共享资源类 Produser类 产出-1 产出-2 产出-3 我的线程没有按照生产者和消费者的行为正常工作。 我在那里附上了我的输出以供击球手理解,因此我的代码中的问题在哪里请验证我,提前感谢您的制作者和消费者正在按预期顺序生产和消费数字。但是,输出是不同步的,因为您不使用同步方法打印它,所以每次执行的顺序都不同 如果将println语句移动到同步的get和set方法: public synchronized int get() { while (available ==

共享资源类

Produser类

产出-1

产出-2

产出-3

我的线程没有按照生产者和消费者的行为正常工作。
我在那里附上了我的输出以供击球手理解,因此我的代码中的问题在哪里请验证我,提前感谢您的制作者和消费者正在按预期顺序生产和消费数字。但是,输出是不同步的,因为您不使用同步方法打印它,所以每次执行的顺序都不同

如果将
println
语句移动到同步的
get
set
方法:

    public synchronized int get() {
        while (available == false) {
            // System.out.println("sharedresorce,while(false)");
            try {
                // /System.out.println("sharedresorce,while(false)object block");
                wait();
                // System.out.println("sharedresorce,while(false)object relise");
            } catch (Exception e) {
                // System.out.println("Thread Interrupted");
            }
        }
        available = false;
        notify();
        System.out.println("Consumer#"  + "getvalue:" + contents);
        return contents;
    }

    public synchronized void set(int value) {
        while (available == true) {
            try {
                wait();
            } catch (Exception e) {
                System.out.println("Thread Interrupted");
            }
        }
        contents = value;
        available = true;
        System.out.println("produser#" + "set:" + value);
        notify();
    }
您将获得预期的输出:

produser#set:1
Consumer#getvalue:1
produser#set:2
Consumer#getvalue:2
produser#set:3
Consumer#getvalue:3
produser#set:4
Consumer#getvalue:4
produser#set:5
Consumer#getvalue:5
produser#set:6
Consumer#getvalue:6
produser#set:7
Consumer#getvalue:7
produser#set:8
Consumer#getvalue:8
produser#set:9
Consumer#getvalue:9
produser#set:10
Consumer#getvalue:10

你的意思是在打印行之前,线程释放锁,另一个线程开始工作,但我已经检查了打印行之前应用睡眠方法,那么为什么另一个线程正在等待完成睡眠时间为什么它不在下面工作是代码sampleclass Produser Extendes thread{private Sharedresource资源;private int number;Produser(Sharedresource s,int number){resource=s;this.number=number;}@Override public void run(){for(int i=1;i@sarvoday同步不能依赖睡眠时间。如果希望同步打印,则必须在同步的方法/块中执行。同步确保线程以正确的顺序执行工作,但它们没有以正确的顺序打印输出。
    class Consumer extends Thread {
        private Sharedresource resource;
        private int number;

        public Consumer(Sharedresource s, int number) {
            resource = s;
            this.number = number;
        }

        int value = 0;

        @Override
        public void run() {
            for (int i = 1; i <= 10; i++) {
                value = resource.get();
                System.out.println("Consumer#" + this.number + "getvalue:" + value);

            }
        }
    }
    public class SynchronizatonDemo121 {

        public static void main(String[] args) {
            Sharedresource r = new Sharedresource();
            Produser p = new Produser(r, 1);
            Consumer c = new Consumer(r, 1);
            p.start();
            c.start();

        }

    }
Consumer#1getvalue:1
produser#1set:1
produser#1set:2
Consumer#1getvalue:2
produser#1set:3
Consumer#1getvalue:3
produser#1set:4
Consumer#1getvalue:4
produser#1set:5
Consumer#1getvalue:5
produser#1set:6
Consumer#1getvalue:6
Consumer#1getvalue:7
produser#1set:7
produser#1set:8
produser#1set:9
Consumer#1getvalue:8
Consumer#1getvalue:9
produser#1set:10
Consumer#1getvalue:10                      
produser#1set:1
produser#1set:2
Consumer#1getvalue:1
Consumer#1getvalue:2
produser#1set:3
Consumer#1getvalue:3
produser#1set:4
Consumer#1getvalue:4
produser#1set:5
Consumer#1getvalue:5
produser#1set:6
Consumer#1getvalue:6
produser#1set:7
Consumer#1getvalue:7
produser#1set:8
Consumer#1getvalue:8
produser#1set:9
Consumer#1getvalue:9
produser#1set:10
Consumer#1getvalue:10
produser#1set:1
Consumer#1getvalue:1
Consumer#1getvalue:2
produser#1set:2
produser#1set:3
Consumer#1getvalue:3
produser#1set:4
Consumer#1getvalue:4
produser#1set:5
Consumer#1getvalue:5
produser#1set:6
Consumer#1getvalue:6
Consumer#1getvalue:7
produser#1set:7
produser#1set:8
Consumer#1getvalue:8
Consumer#1getvalue:9
produser#1set:9
produser#1set:10
Consumer#1getvalue:10
    public synchronized int get() {
        while (available == false) {
            // System.out.println("sharedresorce,while(false)");
            try {
                // /System.out.println("sharedresorce,while(false)object block");
                wait();
                // System.out.println("sharedresorce,while(false)object relise");
            } catch (Exception e) {
                // System.out.println("Thread Interrupted");
            }
        }
        available = false;
        notify();
        System.out.println("Consumer#"  + "getvalue:" + contents);
        return contents;
    }

    public synchronized void set(int value) {
        while (available == true) {
            try {
                wait();
            } catch (Exception e) {
                System.out.println("Thread Interrupted");
            }
        }
        contents = value;
        available = true;
        System.out.println("produser#" + "set:" + value);
        notify();
    }
produser#set:1
Consumer#getvalue:1
produser#set:2
Consumer#getvalue:2
produser#set:3
Consumer#getvalue:3
produser#set:4
Consumer#getvalue:4
produser#set:5
Consumer#getvalue:5
produser#set:6
Consumer#getvalue:6
produser#set:7
Consumer#getvalue:7
produser#set:8
Consumer#getvalue:8
produser#set:9
Consumer#getvalue:9
produser#set:10
Consumer#getvalue:10