목표 : 생산자 스레드와 소비자 스레드가 상호 작동 할 수 있도록 두 개의 스레드를 만들려면 첫 번째 스레드가 두 번째 스레드보다 생산자 역할을하며 그 반대의 경우도 마찬가지입니다.Java 다중 스레드 프로그램에서 생산자 소비자 스레드의 상호 교환 가능한 역할
세부 사항 : 그들은 버퍼를 통해 서로 통신하며 하나의 정수 크기를 저장합니다. 예를 들어 첫 번째 스레드가 1을 생성하면 두 번째 스레드는이를 소비하고 2를 생성 한 다음 첫 번째 스레드는 2를 소비하고 다음 세 개의 정수를 생성하고 Consumer는 하나씩 소비합니다. 그 후에 두 스레드가 종료됩니다. 또한 두 스레드가 모두 통신을 시작할 수 있어야합니다.
다음 코드를 작성하려고했습니다.
import java.util.Random;
class CommonItem {
boolean flag = false;
int arr[];
public synchronized void Send(String msg) {
if (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(msg);
flag = true;
notify();
}
public synchronized void Receive(String msg) {
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(msg);
arr = send_random();
for (int item: arr) {
System.out.println(item);
}
flag = false;
notify();
}
synchronized int[] send_random(){
int[] arr = new int[3];
Random random= new Random();
for (int i = 0; i < 3; i++) {
arr[i]=random.nextInt(100);
}
return arr;
}
}
class T1 implements Runnable {
CommonItem Ci;
public T1(CommonItem Ci) {
this.Ci = Ci;
new Thread(this, "producer").start();
}
public void run() {
while (true)
Ci.Send("sent :1");
}
}
class T2 implements Runnable {
CommonItem Ci;
public T2(CommonItem m2) {
this.Ci = m2;
new Thread(this, "Consumer").start();
}
public void run() {
while (true)
Ci.Receive("received :2");
}
}
public class TestClass {
public static void main(String[] args) {
CommonItem m = new CommonItem();
new T1(m);
new T2(m);
}
}
예상 출력은
sent :1
received :1
sent :2
received :2
sent :57 4 13
received :57 4 13
이다 그러나 나는 다음과 같은 출력을 OUTPUT
sent :1
received :2
57
4
13
제안하십시오를받을 경우 코드에 어떤 수정이나하는 방법에 대한 아이디어 주어진 문제를 다른 방법으로 풀어 라. 미리 감사드립니다. 둘째 의해 처음 25 6 57
수신 소자
어떻게 대기 잘못 사용합니다. 오라클 튜토리얼을 참조하십시오, 나는 그것에 대해 여러 가지 답변을했습니다. 또한 일반적인 데이터 구조에 넣는 것과는 대조적으로 잠금 코드를 작업에 넣는 것은 나쁜 생각처럼 보입니다. 당신은 단순해야하고 복잡해질 뭔가를 가져갔습니다. 또한 코드 규칙을 무시하면 좋지 않습니다. –