简体   繁体   English

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

[英]Producer/Consumer multi-threaded code is not working as expected

Sharedresource class 共享资源类

    class Sharedresource {
        private int contents;
        private boolean available = false;

        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();
            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;
            notify();
        }
    }

Produser class Produser类别

    class Produser extends Thread {
        private Sharedresource resource;
        private int number;

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

        @Override
        public void run() {
            for (int i = 1; i <= 10; i++) {
                resource.set(i);
                System.out.println("produser#" + this.number + "set:" + i);
                // try{
                // sleep(2000);
                // }
                // catch (Exception e) {
                // System.out.println("tread intrupted");
                // }
            }
        }
    }

consumer class 消费阶层

    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);

            }
        }
    }

MAIN CLASS 主班

    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();

        }

    }

output-1 输出-1

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                      

output-2 输出-2-

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

output-3 输出-3-

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

my threads are not working properly as per the producer and consumers behavior. 按照生产者和消费者的行为,我的线程无法正常工作。 I had attached my output over there for batter understanding so where is the problem in my code please verify me, thanks in advance 我已经将输出附加到那儿了,以便对面糊有所了解,因此我的代码中的问题出在哪里,请验证我,在此先感谢

Your producer and consumer are producing and consuming the numbers in the expected order. 您的生产者和消费者正在按预期顺序生产和消费这些数字。 However, the output is not synchronized, since you don't print it in synchronized methods, so you get a different order in each execution. 但是,输出未同步,因为您未以同步方法打印输出,因此每次执行时得到的顺序不同。

If you move your println statements to your synchronized get and set methods : 如果将println语句移至同步的getset方法:

    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();
    }

You'll get the expected output : 您将获得预期的输出:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM