Java多线程之线程的通信

线程通信的常用方法:

    ● wait()方法:令当前线程挂起并放弃CPU同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问。

    ● notify()方法:唤醒正在排队等待同步资源的线程中优先级最高者结束等待。

    ● notifyAll()方法:唤醒正在排队等待资源的所有线程结束等待。使用两个线程打印 1-100. 线程1, 线程2 交替打印

   Java.lang.Object 提供的这三个方法只有在synchronized()方法或者syschronized代码块中才能使用,否者会报异常。

示例代码:使用两个线程打印 1-100. 线程1, 线程2 交替打印

//线程通信。如下的三个关键字使用的话,都得在同步代码块或同步方法中。
//wait():一旦一个线程执行到wait(),就释放当前的锁。
//notify()/notifyAll():唤醒wait的一个或所有的线程
//使用两个线程打印 1-100. 线程1, 线程2 交替打印

class PrintNum implements Runnable {
	int num = 1;
	Object obj = new Object();
	public void run() {
		while (true) {
			synchronized (obj) {
				obj.notify();
				if (num <= 100) {
					try {
						Thread.currentThread().sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + ":"
							+ num);
					num++;
				} else {
					break;
				}
				
				try {
					obj.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

}

public class TestCommunication {
	public static void main(String[] args) {
		PrintNum p = new PrintNum();
		Thread t1 = new Thread(p);
		Thread t2 = new Thread(p);
		
		t1.setName("甲");
		t2.setName("乙");
		
		t1.start();
		t2.start();
	}
}

猜你喜欢

转载自blog.csdn.net/m0_37618340/article/details/82940355