2014-01-27 95 views
0

我需要幫助,我嘗試使用同步線程Java編寫,但它不能運行......線程同步無法工作

我有兩個班,像這樣

for(int j=0;j<idW.length;j++){ 
      webtext = d.getWebText(idW[j]); 
      ThreadPrepo tpo =new ThreadPrepo(webtext, host[j%jumhost], "server", 1099,idW[j]); 
      Thread t1=new Thread(tpo); 
      t1.start(); 
     } 
     //thread untuk setfitur tanpa rmi 
     int ukuran=idW.length; 
     ProsesSetfitur pro=new ProsesSetfitur(idW); 
     Thread t2=new Thread(pro); 
     t2.start(); 

這個線程是在類threadprepo的代碼:

public class ThreadPrepo implements Runnable{ 
    String host,server,c,webtext; 
    int port,idweb; 
    DataDB db=new DataDB(); 
    public ThreadPrepo(String webtext,String host,String server,int port,int idweb){ 
     this.webtext=webtext; 
     this.host=host; 
     this.server=server; 
     this.port=port; 
     this.idweb=idweb;  
    } 
    @Override 
    public void run(){ 
     preponi(); 
    } 

    public synchronized void preponi(){ 
     try{ 
      System.out.println("hostnya :"+host); 
      Registry reg=LocateRegistry.getRegistry(host,port); 
      Sportrmijob rmi=(Sportrmijob) reg.lookup("server"); 
      rmi.SetInput(webtext); 
      List l=rmi.getresult(); 
      String[] hasilprep=new String[l.size()]; 
      for(int k=0;k<l.size();k++){ 
       hasilprep[k]=l.get(k).toString();   
      } 
      db.insertWordney(idweb, hasilprep);  
      String [][] frekdb=db.getFrekDB(idweb); 
      db.doinsertfrek(idweb,frekdb); 

    } 
     catch(Exception e){ 
      System.out.println("error di class threadprepo "+e.getMessage()); 
     } 
    } 

} 

,然後這是類prosesSetFitur代碼

public class ProsesSetfitur implements Runnable{ 
    DataDB d=new DataDB(); 
    int []idweb; 

    public ProsesSetfitur(int[]idweb){ 
     this.idweb=idweb; 
    } 

    @Override 
     public void run(){ 
     try{ 
      Thread.sleep(500); 
      setfitur(); 
     } 
     catch(Exception e){ 
      System.out.println("error setfitur "+e.getMessage());   
     } 
    } 
    public synchronized void setfitur() throws InterruptedException{  

     System.out.println("(proses setfitur)"); 
     String []allkata; 
     String fitur; 
     String []fiturs=new String[15]; 
     String []kata_kata=new String[15]; 
     System.out.println("nilai iD="+idweb.length); 
     for(int s=0;s<idweb.length;s++){ 
      //System.out.println("IDWEEEEEEEEEEB"+idweb[s]); 
      allkata=d.getUrutanKata(idweb[s]); 
      for(int u=0;u<15;u++){ 
       // System.out.println("PERULANGAN U KE"+u); 
       if(u<=4){ 
        fitur="T"; 
        //System.out.println("kata ke" +u+" = "+allkata[u]+" fiturnya = "+fitur); 
        kata_kata[u]=allkata[u]; 
        fiturs[u]=fitur; 
       } 
       else if(u>4&&u<10){ 
        fitur="S"; 
        //System.out.println("kata ke"+u+" = "+allkata[u]+" fiturnya = "+fitur); 
        kata_kata[u]=allkata[u]; 
        fiturs[u]=fitur; 
       } 
       else if(u>=10&&u<15){ 
        fitur="R" ; 
        //System.out.println("kata ke"+u+" = "+allkata[u]+" fiturnya = "+fitur); 
        kata_kata[u]=allkata[u]; 
        fiturs[u]=fitur; 
       } 
      } 
      d.insertfitur(idweb[s], kata_kata, fiturs); 
     } 
     } 

誰能給我的解決方案來解決這個問題...爲什麼螺紋類ProsesSetFitur是執行第一?同步線程是如何工作的?請幫助...

回答

0
public void run(){ 
     try{ 
      Thread.sleep(500); 
      setfitur(); 
     } 

只運行()方法調用一次當你開始一個線程。再次爲不同的線程運行()方法將不同,並只爲線程調用一次。

此外,您的preponi()和setfitur()從run()中調用單個時間。這就是爲什麼你不應該在preponi()和setfitur()之前放置同步修飾符。

當多個線程訪問相同的資源或相同的函數或相同的代碼塊以使線程安全時,您應該使用同步。

 Thread []tArray=new Thread[idW.length]; 

     for(int j=0;j<idW.length;j++) 
     { 
      webtext = d.getWebText(idW[j]); 
      ThreadPrepo tpo =new ThreadPrepo(webtext, host[j%jumhost], "server",  1099,idW[j]); 
      tArray[j]=new Thread(tpo); 
      tArray[j].start(); 
      tArray[j].join(); 
     } 

     //thread untuk setfitur tanpa rmi 
     int ukuran=idW.length; 
     ProsesSetfitur pro=new ProsesSetfitur(idW); 
     Thread t2=new Thread(pro); 
     t2.start(); 
+0

確定...感謝ü@java尋你的答案..我更加明白... 你有解決方案來解決這個問題,讓課堂ThreadPrepo線程可以先執行和那麼之後執行ProsesSetFitur類中的線程? – zorro

+0

...我已經嘗試刪除修改在同步preponi()和setfitur(),但在類ProsesSetFitur仍然線程首先被執行......請幫我T^T ... – zorro

+0

看到我的編輯答案 –

0

線程睡眠可能是一個務實的解決方案,但它不是線程同步的保證。爲了協調線程動作,你應該使用基本的等待/通知模式,而線程使用條件來執行某些動作。爲了一個好的介紹閱讀這篇文章。

http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html http://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example

+0

感謝@Robert爲你的參考資料dokumen ...我會盡力學習這些折扣....感謝你的幫助 – zorro