0

2つのスレッドを使用してデータファイルを送受信する小さなプログラムをJavaで作成しました。2つのスレッドを同じクラスに入れたい。一方のスレッドはファイルを送信し、もう一方のスレッドはファイルを受信します。私はそのためのコードを書きましたが、エラーはほとんどありません。コードのエラーを理解するのを手伝ってくれませんか。私はJavaの学生であり初心者なので、ばかげた間違いがあれば私を惜しまないでください。

import java.lang.Thread.*;
import java.io.*;
public class sendques implements Runnable
{
    int i=0,c;
    static Thread[] t= new Thread[2];
    FileInputStream fis=new FileInputStream("ip.jpg");
    FileOutputStream fos=new FileOutputStream("output.jpg");
    sendques() {
        for(i=0;i<2;i++){
            t[i]=new Thread(this);
            t[i].start();
            System.out.println("Threads "+i);
        }
    }
    void run() {
        while(true) {
            wait();
            send();
        }
    }
    void send() {
        while((c=fis.read())!=-1) {
            t[2].receive(c);
            wait();
        }
    }
    void receive(int d) {
        while(c!=-1) {
            fos.write(d);
            t[1].notify();
        }
    }
    public static void main(String arg[]) {
        sendques sq=new sendques();
        t[1].send();
        System.out.println("Quiting..");
    }
}  
4

1 に答える 1

1

を使用しないでください。 を使用するnotifyことをお勧めしますnotifyAll。という名前の liveness failure が発生する可能性があるためです。コードを修正するのは大変です。異なるクラスを持つプロデューサー/コンシューマーの実装のコードを次に示します。

Buffer クラスは、プロデューサーとコンシューマーの間で共有されるデータを格納するために使用されます。これらには、独自のクラスと、 にある例がありますBoundedBuffer.java。両方の間でメッセージをやり取りするだけで、重い計算作業は必要ありません。これはクリーンな実装です。

于 2012-07-02T23:24:32.147 に答える