下面的程序演示了一个对象被两个线程访问的方法,"monitor.gotMessage();"这一句虽然是monitor对象的方法,但却是运行在"MyObject"的线程里,而不是"monitor"线程里。 BusyWaiting.java:
public class BusyWaiting { public static void main(String[] args) { Monitor monitor = new Monitor(); MyObject o = new MyObject(monitor); new Thread(o, " MyObject ").start(); new Thread(monitor, " monitor ").start(); System.out.println("main thread exit..."); } }
MyObject.java
import java.util.concurrent.TimeUnit; public class MyObject implements Runnable { private final Monitor monitor; public MyObject(Monitor monitor) { this.monitor = monitor; } public void run() { try { TimeUnit.SECONDS.sleep(3); System.out.println("i‘m going."); monitor.gotMessage(); } catch (InterruptedException e) { e.printStackTrace(); } } }
Monitor.java
public class Monitor implements Runnable { private volatile boolean go = false; public void gotMessage() throws InterruptedException { go = true; } public void watching() { while (go == false) ; System.out.println("He has gone."); } public void run() { watching(); } }
另外采用
MyObject o = new MyObject(monitor); new Thread(o, " thread1 ").start(); new Thread(o, "thread2").start();
也是一种常用的多个线程共享数据的方式,