`

Java之synchronized,wait,notify结合运用示例

    博客分类:
  • Java
阅读更多
场景一:要求二个线程各自运行,中间不产生交互行为,等一个方法运行完了,在运行另外一个方法
public class SweetheartsTest {

	public static void main(String[] args) {

		new SweetheartsTest().init();

	}

	private void init() {

		final Sweethearts sweethearts = new Sweethearts();

		// 这二个方法不会产生交互,各执行各的,中间不会被打断
		//synchronized作用于方法上,相当于在对象上加了锁

		new Thread(new java.lang.Runnable() {

			public void run() {

				for (int i = 1; i <= 50; i++) {
					sweethearts.boy(i);
				}
			}

		}).start();

		for (int i = 1; i <= 50; i++) {
			sweethearts.girl(i);
		}

	}

	class Sweethearts {

		synchronized void boy(int i) {

			System.out.println("我好想见到一个女孩呀,怎么没有呢!,次数: " + i);

		}

		synchronized void girl(int i) {

			System.out.println("怎么这条路上男孩子都没有一个呢!死哪了...,次数: " + i);

		}
	}
}

运行结果:
怎么这条路上男孩子都没有一个呢!死哪了...,次数: 1
怎么这条路上男孩子都没有一个呢!死哪了...,次数: 2
怎么这条路上男孩子都没有一个呢!死哪了...,次数: 3
怎么这条路上男孩子都没有一个呢!死哪了...,次数: 4
怎么这条路上男孩子都没有一个呢!死哪了...,次数: 5
怎么这条路上男孩子都没有一个呢!死哪了...,次数: 6
怎么这条路上男孩子都没有一个呢!死哪了...,次数: 7
我好想见到一个女孩呀,怎么没有呢!,次数: 1
我好想见到一个女孩呀,怎么没有呢!,次数: 2
我好想见到一个女孩呀,怎么没有呢!,次数: 3
我好想见到一个女孩呀,怎么没有呢!,次数: 4
我好想见到一个女孩呀,怎么没有呢!,次数: 5
我好想见到一个女孩呀,怎么没有呢!,次数: 6
我好想见到一个女孩呀,怎么没有呢!,次数: 7
我好想见到一个女孩呀,怎么没有呢!,次数: 8
我好想见到一个女孩呀,怎么没有呢!,次数: 9
我好想见到一个女孩呀,怎么没有呢!,次数: 10
我好想见到一个女孩呀,怎么没有呢!,次数: 11
我好想见到一个女孩呀,怎么没有呢!,次数: 12
....

它们之间没有交互的行为,就好像二个陌生人一样,各做各的,你们相识吧!
场景二 :要求二个线程之间相互交互
public class SweetheartsTest2 {

	public static void main(String[] args) {

		new SweetheartsTest2().init();

	}

	private void init() {

		final Sweethearts bb = new Sweethearts();

		// 这个类的二个方法,相互交互,很好的运用了wait与notify

		new Thread(new java.lang.Runnable() {

			public void run() {

				for (int i = 1; i <= 50; i++) {
					bb.boy(i);
				}

			}
		}).start();

		for (int i = 1; i <= 50; i++) {
			bb.girl(i);
		}

	}

	class Sweethearts {

		boolean tag = false;

		synchronized void boy(int i) {

			//判断是否被女孩唤醒
			while (!tag) {
				try {
					//继续等待女孩发问
					wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

			//女孩问了,男孩回答
			System.out.println("男孩说到:我叫刘风!");
			//设置为等待女孩发问的标记
			tag = false;
			//唤醒女孩发问
			notify();

		}

		synchronized void girl(int i) {

			//判断是否被男孩唤醒
			while (tag) {
				try {
					//等待男孩的回答
					wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			//男孩回答完了,女孩又问他
			System.out.print("女孩问到:Hello,小子叫什么名字呢!");
			//设置为等待男孩回答的标记
			tag = true;
			//唤醒男孩回答问题
			notify();

		}
	}
}

运行结果如下:
女孩问到:Hello,小子叫什么名字呢!男孩说到:我叫刘风!
女孩问到:Hello,小子叫什么名字呢!男孩说到:我叫刘风!
女孩问到:Hello,小子叫什么名字呢!男孩说到:我叫刘风!
女孩问到:Hello,小子叫什么名字呢!男孩说到:我叫刘风!

它们之间很好的进行了交互,一问一答,多么有趣呀
分享到:
评论

相关推荐

    Java 同步方式 wait和notify/notifyall

    总结一下,`wait()`, `notify()`, 和 `notifyAll()` 是Java多线程编程中的核心工具,它们与`synchronized`关键字一起,为线程间的协作提供了强大的支持。理解并熟练掌握这些概念,对于编写高效、安全的多线程程序至...

    Java的sychronized、wait和notify范例

    在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...

    wait_notify_demo

    `wait()`、`notify()`和`notifyAll()`是Java中的三个关键字,它们属于Object类的方法,主要用于线程间的通信,尤其在实现生产者消费者模式时发挥着重要作用。本文将深入探讨这些方法以及如何在实际场景中应用它们。 ...

    浅谈java多线程wait,notify

    在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...

    一个理解wait()与notify()的例子

    本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要手段之一,尤其在解决生产者消费者模型、读者写者问题等经典...

    详解Java程序并发的Wait-Notify机制

    Java程序并发的Wait-Notify机制是Java多线程编程中的一种重要同步工具,它允许线程之间通过共享对象进行通信和协作。这个机制基于Java的内置锁(也称为监视器锁),通常与`synchronized`关键字一起使用。在Java中,`...

    等待机制与锁机制wait notify

    下面通过一个简单的示例来演示`wait`、`notify`和`notifyAll`的使用: ```java public class TestWaitNotify { private final Object lock = new Object(); public void producer() { synchronized (lock) { /...

    详细分析java线程wait和notify

    在使用`wait()`和`notify()`时,必须确保它们在`synchronized`上下文中调用,这通常是在`synchronized`方法或`synchronized`代码块内。这是因为在非同步环境中调用这些方法会导致`IllegalMonitorStateException`。...

    synchronized用法大全实例

    `synchronized`还提供了基于`wait()`、`notify()`和`notifyAll()`的方法,用于线程间的通信。这些方法必须在同步块或同步方法中使用,否则会抛出`IllegalMonitorStateException`。等待/通知机制可以让一个线程在特定...

    Java多线程同步(wait()notify()notifyAll())[文].pdf

    本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...

    主线程去控制子线程wait与notify

    在Java多线程编程中,`wait()`和`notify()`是两个非常重要的方法,它们用于线程间的协作和通信。这两个方法是Java语言中的Object类提供的,因此所有的对象都可以使用。在本文中,我们将深入探讨如何使用主线程来控制...

    java 多线程示例

    Java提供了synchronized关键字来实现线程同步,确保同一时刻只有一个线程能执行特定代码块。 5. **死锁** 死锁是两个或多个线程相互等待对方释放资源而造成的僵局。避免死锁的关键在于遵循资源请求的顺序化和避免...

    Java网络编程示例代码

    这些示例可能包含并发控制(如synchronized关键字,Lock接口),线程池的使用(ExecutorService,ThreadPoolExecutor)以及线程间的通信(如wait(),notify(),Condition等)。 其次,URL/RMI编程示例代码涉及到...

    JAVA核心技术示例

    线程同步机制如synchronized关键字、wait/notify、Semaphore等也是多线程编程中的重要知识点。 6. **网络编程**:Java的Socket编程允许开发者创建客户端和服务器应用程序,进行TCP/IP通信。此外,URL和...

    wait,notify等线程知识.pdf

    `wait` 和 `notify` 是Java语言提供的原生方法,用于解决线程之间的同步问题。本文将详细介绍这些方法的基本原理、使用场景以及最佳实践。 #### 二、基本概念 在Java中,`wait()` 和 `notify()` 方法用于实现线程间...

    java线程-保护性暂停(wait,notify实现).docx

    Java 线程保护性暂停(wait,notify 实现) ...本文详细讲解了 Java 线程中的保护性暂停机制,即 wait 和 notify 方法的实现,并提供了一个实际的示例代码,演示如何使用保护性暂停机制来实现线程之间的通信。

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    public class ThreadWaitNotify { public static void main(String[] args) throws InterruptedException { DemoTest demoTest = new DemoTest(); // 使用线程池异步执行waitTest方法 ExecutorService ...

    javasynchronized详解.pdf

    - `synchronized`无法解决线程间的通讯问题,比如生产者消费者问题,此时需要配合`wait()`和`notify()`方法。 - `synchronized`关键字与Java内存模型(JMM)紧密关联,确保了可见性和有序性,防止数据竞争。 总之...

    自己做的一套java示例工程 非常实用

    示例工程可能包括Thread类和Runnable接口的使用,以及线程同步和互斥的概念,例如synchronized关键字、wait()、notify()和notifyAll()方法。 6. **网络编程**:Java通过Socket和ServerSocket类支持网络通信。Java...

Global site tag (gtag.js) - Google Analytics