Java 线程同步可以';行不通

Java 线程同步可以';行不通,java,multithreading,synchronization,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(

我需要帮助,我尝试在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();
for(int j=0;j
启动线程时只调用一次run()方法。同样,对于不同的线程,run()方法将不同,并且只为线程调用一次

另外,您的prepni()和setfitur()调用了single time from run()。这就是为什么您不应该将synchronized修饰符放在prepni()和setfitur()之前

当多个线程访问同一资源、同一函数或同一代码块时,应该使用synchronized,以使其线程安全

Thread[]tArray=新线程[idW.length];

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


好的……感谢u@java seeker的回答……我变得更明白了……你有解决这个问题的办法吗?这样ThreadPrep类中的线程可以先执行,然后再执行ProsesSetFitur类中的线程?……我尝试删除Prepini()和setfitur()中同步的修饰符但课堂上的线程仍然是先执行的…请帮助我T^T…谢谢@Robert的引用dokumen…我将尝试学习引用…谢谢你的帮助
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());
        }
    }

}
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);
      } 
      }
 public void run(){
      try{
          Thread.sleep(500);
          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();