Java notify的使用

半路出家学习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线程等待进程.

纯粹本人观点, 有错误欢迎指出.

 

你可能感兴趣的:(notify)