当前位置: 代码迷 >> J2SE >> Java线程间同步的有关问题
  详细解决方案

Java线程间同步的有关问题

热度:55   发布时间:2016-04-24 13:03:24.0
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();       }}
  相关解决方案