线程同步无法正常工作

时间:2014-01-27 06:58:31

标签: java multithreading synchronization

我需要帮助,我尝试在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类中的线程首先执行?同步线程如何工作?请帮助......

2 个答案:

答案 0 :(得分:0)

 public void run(){
      try{
          Thread.sleep(500);
          setfitur();
      }
  启动线程时,只调用一次

run()方法。同样对于不同的线程run()方法将是不同的,并且只为该线程调用一次。

你的preponi()和setfitur()也会从run()调用一次。这就是为什么你不应该在preponi()和setfitur()之前放置synchronized修饰符。

  当多个线程访问相同的资源或相同的函数或相同的代码块时,你应该使用synchronized来使线程安全。

       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();

答案 1 :(得分:0)

线程休眠可能是一个实用的解决方案,但它不是线程同步的保证。要协调线程操作,您应该使用基本的等待/通知模式,而线程使用条件来执行某些操作。有关好的介绍请阅读本文。

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