日期:2014-05-20  浏览次数:20707 次

Java线程间同步的问题
大家好:
  我的程序中定义了ThreadClass1 ThreadClass2 两个类(从Thread继承)。
  有一个全局的数组A[10]
  ThreadClass1中会write A[]
  ThreadClass2中会Read A[] 
  为了保证A[0]..A[9]是ThreadClass1在同一次写入的数据,
  该如何写?能提供例程吗? 

  谢谢!
 

------解决方案--------------------
参考 notify() 和wait() 方法的用法 好象有个经典的生产者消费者的例子应该是处理这类问题的.
给一段参考代码吧:
Java code

public class WaitComm {
    public static void main(String[] args) {
        WFlagSend s = new WFlagSend();
        WFlagRec r = new WFlagRec(s);
        Thread st = new Thread(s);
        Thread rt = new Thread(r);
        rt.setDaemon(true);
        st.start();
        rt.start();
        try {
            st.join();
            while ( s.isValid ){
                Thread.sleep(100);
            }
        }catch(InterruptedException e){
            e.printStackTrace();
            }
    }
}

class WFlagSend implements Runnable {
     int theValue;
     boolean isValid;
    
    public void run() {
        for ( int i=0; i<5; i++){
            synchronized(this){
                while (isValid){
                    try{
                        this.wait();
                    }catch(Exception e){e.printStackTrace();}
                }
            }
            theValue = (int)(Math.random()*256);
            System.out.println("sending " + theValue );
            synchronized(this){
                isValid = true;
                this.notify();
            }
            
        }
    }
}

class WFlagRec implements Runnable {
    private WFlagSend theSender;
    public WFlagRec(WFlagSend sender){
        theSender = sender;
        }
    public void run() {
        while ( true ) {
            synchronized(theSender) {
                while ( !theSender.isValid ){
                    try{
                        theSender.wait();
                    }catch(Exception e){e.printStackTrace();}
                }
            
            }
            System.out.println("received " + theSender.theValue);
            synchronized(theSender) {
                theSender.isValid = false;    
                theSender.notify();
            }
        }    
    }
}

------解决方案--------------------
Java code

class Test
{
       public static void main(String[] args)
       {
               final Arrays a = new Arrays();
               Thread t1 = new Thread()
               {
                       public void run()
                       {
                               int j=1;
                               while(true)
                               {
                                       a.write(j++);
                               }
                       }
               };
               Thread t2 = new Thread()
               {
                       public void run()
                       {
                               while(true)
                               {
                                       a.read();
                               }
                       }
               };
               t1.start();
               t2.start();
       }
}

class Array
{
       int n = 0;
       int[] num = new int[n];
       boolean b = false;
       synchronized void write(int j)
       {
               int n = 0;
               try
               {
                       if (b)
                       {
                               wait();
                       }
               }
               catch(Exception e)
               {
                       System.out.println(e);
               }
               num[n++] = j;
               System.out.println(Thread.currentThread().getName()+" "+num[n]);
               b = true;
               notify();
       }
       synchronized void read()
       {
               try
               {
                       if(!b)
                       {
                       wait();
                       }
               }
               catch(Exception e)
               {
                       System.out.println(e);
               }
               System.out.println(Thread.currentThread().getName()+" "+num[n]);

               b = false;
               notify();
       }
}