[英]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
语句移至同步的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();
}
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.