2012-04-09 57 views
0

我在java中編寫了一個使用兩個線程發送和接收數據文件的小程序。我想讓這兩個線程在同一個類中。一個線程發送文件,另一個線程接收文件。我已經爲它寫了代碼,但幾乎沒有錯誤。你能幫我弄清楚代碼中的錯誤嗎?我是一名學生,是一名初學者,所以如果有任何愚蠢的錯誤,請不要猶豫。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.."); 
    } 
} 
+1

你看到了什麼錯誤?請編輯您的問題,以提供指出哪一行對應於哪一行號的細節。 – Gray 2012-04-09 16:57:48

+0

錯誤#1:代碼不能編譯。除非你使用'Thread'的自定義實現,否則不會有像'send','write'或'receive'這樣的事情。 – Howard 2012-04-09 16:59:02

+2

這個代碼中有太多的問題需要解決。除了它沒有編譯的事實之外,設計實際上是不可重用的。你顯然應該在兩個不同的類中將發送方法與接收方分開。您還應該在第三個線程中創建線程或使用Java提供的其中一個ThreadPool。嘗試閱讀關於生產者/消費者和線程的文檔。 SO – 2012-04-09 17:55:34

回答

1

不要使用notify,更好地利用notifyAll,因爲活躍度衰竭時可出現,命名爲:錯過信號。它將使很難糾正你的代碼,這裏是生產者/消費者的實現與不同類的代碼:

緩衝區類用於存儲生產者和消費者之間共享的數據。他們有自己的課程,你可以在BoundedBuffer.java找到一個例子。他們沒有涉及繁重的計算任務,只是在兩者之間傳遞消息。 這是一個乾淨的實現,嘗試通過它。