2017-12-25 12 views
1

目的:プロデューサとコンシューマスレッドが互換性を持つように2つのスレッドを作成する。Javaマルチスレッドプログラムでプロデューサコンシューマスレッドの交換可能な役割

詳細:バッファを介して互いに通信します.1つの整数サイズを格納します。例えば、最初のスレッドが1を生成した場合、2番目のスレッドはそれを消費して2を生成し、次に1番目のスレッドは2を消費し、次の3つの整数を生成し、Consumerはそれらを1つずつ消費します。 その後、両方のスレッドが終了します。 また、両方のスレッドが通信を開始できる必要があります。

次のコードを書き込もうとしました。

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
受信素子によって

+0

どのように待ち時間が間違って使用します。 Oracleのチュートリアルを参照してください、私もそれについて複数の答えがあります。また、共通のデータ構造に置くのではなく、タスクにロッキングコードを置くことは悪い考えです。シンプルで複雑なものを取った。また、コード規約を無視することは良くありません。 –

答えて

1
public class CommonItem { 
    boolean receiver = false; 
    List<Integer> list = new ArrayList<>(); 

    public void receive() throws InterruptedException { 
     String name = Thread.currentThread().getName(); 
     synchronized (list) { 
      while (list.isEmpty()) { 
       list.notify(); 
       list.wait(); 
      } 

      // Receive all elements 
      System.out.printf("Receiving elements by %s:\t", name); 
      for (int val : list) { 
       System.out.print(val + " "); 
      } 
      list.clear(); 
      System.out.println(); 
      list.notify(); 
      list.wait(); 
     } 
    } 

    public void send() throws InterruptedException { 
     String name = Thread.currentThread().getName(); 
     synchronized (list) { 
      while (!list.isEmpty()) { 
       list.notify(); 
       list.wait(); 
      } 
      // Sending elements 
      int[] arr = get_random(); 
      System.out.printf("Sending elements by %s\t", name); 
      for (int ele : arr) { 
       list.add(ele); 
       System.out.print(ele + " "); 
      } 
      System.out.println(); 
      list.notify(); 
      list.wait(); 
     } 
    } 

    public int[] get_random() throws InterruptedException { 
     int[] arr = new int[3]; 
     Random random = new Random(); 
     for (int i = 0; i < 3; i++) { 
      arr[i] = random.nextInt(100); 
     } 
     Thread.sleep(1000); 
     return arr; 
    } 
} 

public class ThreadTask implements Runnable { 

    private CommonItem item; 
    private boolean receiver; 

    public ThreadTask(CommonItem item, boolean receiver) { 
     this.item = item; 
     this.receiver = receiver; 
    } 

    public static void main(String[] args) { 
     CommonItem item = new CommonItem(); 
     Thread t1 = new Thread(new ThreadTask(item, false), "First"); 
     Thread t2 = new Thread(new ThreadTask(item, true), "Second"); 
     t1.start(); 
     t2.start(); 
    } 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       if (receiver) { 
        item.receive(); 
       } else { 
        item.send(); 
       } 
       receiver = !receiver; 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

送信要素まずすることにより、第2 35 99 10
受信素子によって25の6 57
送信要素:35 99 10
送信素子最初に84 11 1
秒で受信する要素:84 11 1
秒で要素を送信する68 91 53
まず:68の91 53

+0

ありがとうございます。私は解決策を得た。 –

+0

私は投票に値しますか?:-) – sanit

+0

あなたのコードから全体の解決策を得ました。 –

0
package java11; 
import java.util.*; 
import java.util.Random; 
class CommonItem 
{ 
    boolean receiver = false; 
    List<Integer> list = new ArrayList<>(); 
    int k=1; 
    public void receive() throws InterruptedException 
    { 
     String name = Thread.currentThread().getName(); 
     synchronized (list) 
     { 
      while (list.isEmpty()) 
      { 
       list.notify(); 
       list.wait(); 
      } 
      // Receive all elements 
      System.out.printf("Receiving elements by %s:\t", name); 
      for (int val : list) 
      { 
       System.out.print(val + " "); 
      } 
      list.clear(); 
      System.out.println(); 
      list.notify(); 
      list.wait(); 
     } 
    } 

    public void send(int i) throws InterruptedException 
    { 
     String name = Thread.currentThread().getName(); 
     synchronized (list) 
     { 
      while (!list.isEmpty()) 
      { 
       list.notify(); 
       list.wait(); 
      } 
      // Sending elements 
      int[] arr; 
      if(i<3) 
      { 
       arr = get_random(k); 
       k++; 
      } 
      else 
      { 
       arr = get_random1(); 
      } 
      System.out.printf("Sending elements by %s\t", name); 
      for (int ele : arr) 
      { 
       list.add(ele); 
       System.out.print(ele + " "); 
      } 
      System.out.println(); 
      list.notify(); 
      list.wait(); 
     } 
    } 

    public int[] get_random(int k) throws InterruptedException 
    { 
     int[] arr = new int[1]; 
     arr[0] = k; 
     Thread.sleep(1000); 
     return arr; 
    } 

    public int[] get_random1() throws InterruptedException 
    { 
     int[] arr = new int[3]; 
     Random random = new Random(); 
     for (int i = 0; i < 3; i++) 
     { 
      arr[i] = random.nextInt(100); 
     } 
     Thread.sleep(1000); 
     return arr; 
    } 
} 

public class Java11 implements Runnable 
{ 
    private CommonItem item; 
    private boolean receiver; 

    public Java11(CommonItem item, boolean receiver) 
    { 
     this.item = item; 
     this.receiver = receiver; 
    } 

    public static void main(String[] args) 
    { 
     int choice; 
     CommonItem item = new CommonItem(); 
     System.out.println("Who should start first?:Thread 1 or Thread 2"); 
     Scanner sc=new Scanner(System.in); 
     choice=sc.nextInt(); 
     if(choice==1) 
     { 
      Thread t1 = new Thread(new Java11(item, false), "First"); 
      Thread t2 = new Thread(new Java11(item, true), "Second"); 
      t1.start(); 
      t2.start(); 
     } 
     else if(choice==2) 
     { 
      Thread t1 = new Thread(new Java11(item, true), "First"); 
      Thread t2 = new Thread(new Java11(item, false), "Second"); 
      t1.start(); 
      t2.start(); 
     } 
    } 

    @Override 
    public void run() 
    { 
     int i=1; 
     while (i<=3) 
     { 
      try 
      { 
       if (receiver) 
       { 
        item.receive(); 
       } 
       else 
       { 
        item.send(i); 
       } 
       receiver = !receiver; 
      } 
      catch(InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
      i++; 
     } 
    } 
} 

わずかな変化は、問題文で要求として、正確な出力を得るためにSanitのコードで作られています。

OUTPUT:

Who should start first?:Thread 1 or Thread 2 
1 
Sending elements by First 1 
Receiving elements by Second: 1 
Sending elements by Second 2 
Receiving elements by First: 2 
Sending elements by First 90 95 28 
Receiving elements by Second: 90 95 28 

Who should start first?:Thread 1 or Thread 2 
2 
Sending elements by Second 1 
Receiving elements by First: 1 
Sending elements by First 2 
Receiving elements by Second: 2 
Sending elements by Second 42 10 33 
Receiving elements by First: 42 10 33 

あなたは@Sanitありがとうございます。

Solved- @Kunjanラナ

+0

2つのスレッド間の通信は、1を送信することから始まります。 –

関連する問題