`

java的多线程编程

 
阅读更多
    要求:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,
接着再回到主线程又循环100,如此循环50次,请写出程序。


    我的程序如下:
public class MainThread extends Thread {
	private Object lock;
	private int num;
	private int limit;

	public MainThread(Object lock, int limit) {
		this.lock = lock;
		this.limit = limit;
	}

	public static void main(String[] args) {
		Object lock = new Object();

		SubThread sub = new SubThread(lock, 50);
		sub.start();

		MainThread thread = new MainThread(lock, 50);
		thread.start();

	}

	public void run() {
		while (true) {
			if (this.num < limit) {
				this.num++;
			} else {
				synchronized (lock) {
					lock.notify(); // 通知子线程结束
					System.out.println("通知子线程结束");
				}
				break;
			}
			synchronized (lock) {
				lock.notify();
				try {
					lock.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			for (int i = 0; i < 100; i++) {
				System.out.println("MainThread:" + i);
			}
		}
		System.out.println("Main end.");
	}

}


public class SubThread extends Thread {
	private Object lock;
	private int limit;
	private int num;

	public SubThread(Object lock, int limit) {
		this.lock = lock;
		this.limit = limit;
	}

	@Override
	public void run() {
		while (true) {
			if (this.num < limit) {
				this.num++;
			} else {
				break;
			}
			for (int i = 0; i < 10; i++) {
				System.out.println("SubThread:" + i);
			}
			synchronized (lock) {
				lock.notify();
				try {
					lock.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println("Sub end.");
	}
}
分享到:
评论
2 楼 yuanq_20 2013-02-23  
推荐,JDK5后使用线程对象Lock操作
1 楼 asialee 2012-11-06  

   看到网上有人总结了下面几句话:
  1. 任何一个时刻,对象的控制权(monitor)只能被一个线程拥有。
   2. 无论是执行对象的wait、notify还是notifyAll方法,必须保证当前运行的线程取得了该对象的控制权(monitor)。
   3. 如果在没有控制权的线程里执行对象的以上三种方法,就会报java.lang.IllegalMonitorStateException异常。
   4. JVM基于多线程,默认情况下不能保证运行时线程的时序性。

相关推荐

Global site tag (gtag.js) - Google Analytics