大家好:
我的程序中定义了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(); }}