1

質問は次のとおりです。

3つのスレッドを作成します。

  • 最初のものは10個の乱数を生成します。
  • 2番目はこれらの10の偶数を合計します。
  • 3番目は、同じ10個の乱数の奇数を合計します。

私の問題は次のとおりです。2番目のスレッドですべての数値を読み取り、それらをストリームにプッシュバックしますが、3番目のスレッドがストリームから読み取りたい場合、最初に読み取られる値は-1 ?!

コードは次のとおりです。

//main program 
import java.io.*;
public class anonymous {

public static void main(String[] args) throws  IOException, InterruptedException {
    final PipedOutputStream out= new PipedOutputStream();  
    final PipedInputStream in= new PipedInputStream(out);
    Thread1 th1 = new Thread1(out);
    Thread2 th2 = new Thread2(in);
    Thread3 th3 = new Thread3(in); 
    Thread t1 = new Thread(th1);
    Thread t2 = new Thread(th2); 
    Thread t3 = new Thread(th3); 
    t1.start(); 
    t2.start();
    t2.join();
    t3.start(); 
    t3.join();
    System.out.println("main finished.");   
}
}

//Thread1
import java.io.*;
import java.util.Random;
public class Thread1 implements Runnable{
PipedOutputStream out=null;
Random r = new Random();
public Thread1(PipedOutputStream send){
    this.out = send; 
}
public void run(){
    int num;
    System.out.println("thread 1 generated random numbers: ");
    try{
    for ( int i=0; i<10; i++)
        {
        num=r.nextInt(10);
        System.out.print(num + " ");
        out.write(num);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } 
try {
    out.close();
} catch (IOException e) {
    e.printStackTrace();
}
System.out.println("\nthread 1 finished");
}
}

//Thread2
import java.io.*;
public class Thread2 implements Runnable{
PipedInputStream in=null;
public Thread2( PipedInputStream get){
    this.in = get;

}
public void run(){ 
    PushbackInputStream push = new PushbackInputStream(in , 10);
    //PushbackInputStream takes an InputStream and it will read the first 10 bytes
            // in the stream and push them back to the stream
    try {
        byte[] byteArr = new byte[10]; 
        int i, sum=0, idx=0;
        i=push.read();
        while (i != -1)
        { 
            if( i%2 == 0)
                sum += i; 
            byteArr[idx]=( byte) i;
            i=push.read();
            idx++;
        }
        push.unread(byteArr,0 , 10);
        System.out.println("thread 2: the sum of even random numbers: " + sum); 
    } catch (IOException e) {
        e.printStackTrace();
    }
System.out.println("thread 2 finished"); 
}
}

//Thread3
import java.io.*;
public class Thread3 implements Runnable{

PipedInputStream in;
public Thread3( PipedInputStream get){
    this.in = get;
}
public void run(){
    try {
        int i, sum=0;
        i=in.read();
        while (i != -1)
        { 
            if( i%2 == 1)
                sum += i; 
            i=in.read();
        }
        System.out.println("thread 3: the sum of odd random numbers:  " + sum);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        in.close();
    } catch (IOException e){
        e.printStackTrace();
    } 
System.out.println("thread 3 finished"); 
}
}

次のような出力:

スレッド1が生成した乱数:
4 8 7 5 6 8 7 1 0 5
スレッド1が終了しました
スレッド2:偶数の乱数の合計:26
スレッド2が終了しました
スレッド3:奇数の乱数の合計:0
スレッド3が終了しました
メインが終了しました。

4

1 に答える 1

3

プッシュバック機能を悪用するのではなく、2番目と3番目のストリームの間に別のパイプを使用する必要があります。

于 2012-11-03T22:39:44.973 に答える