SharedresourceProducer/Consumer многопоточный код не работает, как ожидалось класса
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 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");
// }
}
}
}
потребительского класса
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();
}
}
выход-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
Выход 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
выход-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
мои темы не работают должным образом в соответствии с поведением производителей и потребителей. Я приложил свой вывод туда для понимания теста, так где проблема в моем коде, пожалуйста, подтвердите меня, заранее заблаговременно
вы имеете в виду в печать до линии нитей высвобождают замок и другие потоки начинают работать, но я проверил с применением методов сна перед печатью, тогда почему другой поток ждет завершения сна, почему его не выполняет свою работу ниже, это пример кода – sarvoday
класс Produser extends Thread { \t частный ресурс Sharedresource; \t частный номер int; \t Produser (Sharedresource s, int number) { \t \t Ресурс = s; \t \t это.число = число; \t} \t \t @Override общественного недействительными запуска() { \t \t для (INT = 1; г <= 10; я ++) { \t \t \t resource.set (я); \t \t \t попробовать { \t \t \t \t Thread.sleep (10000); \t \t \t} задвижка (InterruptedException е) { \t \t \t \t // TODO автоматическая генерация улова Блокировать \t \t \t \t e.printStackTrace(); \t \t \t} \t \t System.out.println ("produser #" + this.number + "set:" + i); – sarvoday
@sarvoday Вы не можете полагаться на время сна для синхронизации. Если вы хотите, чтобы печать была синхронизирована, она должна выполняться в синхронизированных методах/блоках. Ваша синхронизация обеспечила, чтобы ваши потоки выполняли свою работу в правильном порядке, но они не печатали свой вывод в правильном порядке. – Eran