半路出家学习java, 花了几分钟简单看了。在早上那个例子上稍微改了下,

notify 对象上必须使用 synchronized

我的理解是在java synchronized只是个线程同步标志,但是不会堵塞线程,而wait会堵塞调用者线程,类windows的堵塞函数,而notify相当于解锁(个人把它当成windows开发的event来理解的, wait 相当于 resertevent加 WaitForSingleObject 挂起线程,  对象相当于event, notify相当于 setevent),下边例子主要是,默认先运行的线程test1会先执行, 我稍微改了下, 让第一个线程挂起,等第二个线程执行完,再执行第一个线程

代码

import java.util.concurrent.CountDownLatch;

public class CountDown {
	private static CountDownLatch connectedSignal = new CountDownLatch(50);

	static class MyThread implements Runnable {

		public void run() {
			Thread current = Thread.currentThread();
			System.out.println(current.getName());
			
			synchronized (connectedSignal) {
				Thread thread = Thread.currentThread();
				String name = thread.getName();
				
				if (name.equals("test1")){
					try {
						connectedSignal.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
				for (int i = 0; i < 25; ++i) {
					sale();
				}
				
				if (name.equals("test2")){
					connectedSignal.notify();
				}	
			}
		}

		public synchronized void sale() {
			if (connectedSignal.getCount() > 0) {
				Thread current = Thread.currentThread();
				connectedSignal.countDown();
				System.out.println("Thread id" + current.getId() + "value = "
						+ connectedSignal.getCount());
			}
		}

	}

	public static void main(String[] args) throws InterruptedException {
		MyThread my = new MyThread();
		Thread t1 = new Thread(my, "test1");
		Thread t2 = new Thread(my, "test2");

		t1.start();
		t2.start();

		connectedSignal.await(); // 等待结束
		System.out.println(connectedSignal.getCount());
	}
}

又花了几分钟稍微改了下, 让两个线程轮流执行

import java.util.concurrent.CountDownLatch;

public class CountDown {
	private static CountDownLatch connectedSignal = new CountDownLatch(50);

	static class MyThread implements Runnable {

		public void run() {
			Thread current = Thread.currentThread();
			System.out.println(current.getName());
			
			synchronized (connectedSignal) {
				Thread thread = Thread.currentThread();
				String name = thread.getName();
				
//				if (name.equals("test1")){
//					try {
//						connectedSignal.wait();
//					} catch (InterruptedException e) {
//						// TODO Auto-generated catch block
//						e.printStackTrace();
//					}
//				}
				
				
				for (int i = 0; i < 25; ++i) {
					if (name.equals("test1") && (i % 2 == 0)){
						try {
							sale(); 
							connectedSignal.notify();
							connectedSignal.wait();
							connectedSignal.notify();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					else{
						sale();
						connectedSignal.notify();
						try {
							connectedSignal.wait();
							connectedSignal.notify();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
				
//				if (name.equals("test2")){
//					connectedSignal.notify();
//				}	
			}
		}

		public synchronized void sale() {
			if (connectedSignal.getCount() > 0) {
				Thread current = Thread.currentThread();
				connectedSignal.countDown();
				System.out.println("Thread id" + current.getId() + "value = "
						+ connectedSignal.getCount());
			}
		}

	}

	public static void main(String[] args) throws InterruptedException {
		MyThread my = new MyThread();
		Thread t1 = new Thread(my, "test1");
		Thread t2 = new Thread(my, "test2");

		t1.start();
		t2.start();

		connectedSignal.await(); // 等待结束
		System.out.println(connectedSignal.getCount());
		
	}
}

 

结果和我想的一样。感觉本身线程使用挺简单的,java估计是为了开发者更方便开发, 自己封装再提供了更多的功能,反倒让我很不习惯。

wait线程之间的等待,waitFor线程等待进程.