java测试线程同步synchronized,生产者消费者模型wait、notify、notifyAll
java测试线程同步synchronized
TT.java
public class TT implements Runnable { int b = 100; public synchronized void m1() throws Exception{ //Thread.sleep(2000); b = 1000; Thread.sleep(5000); System.out.println("b = " + b); } public synchronized void m2() throws Exception { Thread.sleep(2500); b = 2000; } public void run() { try { m1(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { TT tt = new TT(); Thread t = new Thread(tt); t.start(); //t.sleep(500); tt.m2(); System.out.println(tt.b); } }
F:\java\Thread>javac TT.java F:\java\Thread>java TT 1000 b = 1000 F:\java\Thread>
生产者消费者模型wait、notify、notifyAll
/* 生产者消费者模型 */ public class ProducerConsumer { public static void main(String[] args) { //一个篮子 SyncStack ss = new SyncStack(); //生产者 Producer p = new Producer(ss); //消费者 Consumer c = new Consumer(ss); new Thread(p).start(); new Thread(c).start(); } } //窝头 class WoTou { int id; WoTou(int id) { this.id = id; } public String toString() { return "WoTou : " + id; } } //同步栈,先进后出 class SyncStack { int index = 0; //一个篮子放6个数组的窝头 WoTou[] arrWT = new WoTou[6]; //放 public synchronized void push(WoTou wt) { while(index == arrWT.length) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); arrWT[index] = wt; index ++; } //拿 public synchronized WoTou pop() { while(index == 0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); index--; return arrWT[index]; } } //生产者 class Producer implements Runnable { SyncStack ss = null; Producer(SyncStack ss) { this.ss = ss; } public void run() { for(int i=0; i<20; i++) { WoTou wt = new WoTou(i); ss.push(wt); System.out.println("生产了:" + wt); try { Thread.sleep((int)(Math.random() * 200)); } catch (InterruptedException e) { e.printStackTrace(); } } } } //消费者 class Consumer implements Runnable { SyncStack ss = null; Consumer(SyncStack ss) { this.ss = ss; } public void run() { for(int i=0; i<20; i++) { WoTou wt = ss.pop(); System.out.println("消费了: " + wt); try { Thread.sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
F:\java\Thread>javac ProducerConsumer.java F:\java\Thread>java ProducerConsumer 生产了:WoTou : 0 消费了: WoTou : 0 生产了:WoTou : 1 生产了:WoTou : 2 生产了:WoTou : 3 生产了:WoTou : 4 生产了:WoTou : 5 生产了:WoTou : 6 消费了: WoTou : 6 生产了:WoTou : 7 消费了: WoTou : 7 生产了:WoTou : 8 消费了: WoTou : 8 生产了:WoTou : 9 消费了: WoTou : 9 生产了:WoTou : 10 消费了: WoTou : 10 生产了:WoTou : 11 消费了: WoTou : 11 生产了:WoTou : 12 消费了: WoTou : 12 生产了:WoTou : 13 消费了: WoTou : 13 生产了:WoTou : 14 消费了: WoTou : 14 生产了:WoTou : 15 生产了:WoTou : 16 消费了: WoTou : 15 消费了: WoTou : 16 生产了:WoTou : 17 生产了:WoTou : 18 消费了: WoTou : 17 消费了: WoTou : 18 生产了:WoTou : 19 消费了: WoTou : 19 消费了: WoTou : 5 消费了: WoTou : 4 消费了: WoTou : 3 消费了: WoTou : 2 消费了: WoTou : 1 F:\java\Thread>
相关推荐
9. **测试与调试**:多线程问题往往难以复现,因此在编写生产者-消费者代码时,应编写充分的测试用例,包括边界情况,如缓冲区满和空的状态转换。 通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者...
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
下面是一个简单的生产者消费者模型示例,演示了`wait()`, `notify()` 的使用: ```java public class Buffer { private int data; private boolean available = false; public synchronized void put(int item)...
本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...
在实际开发中,除了使用synchronized和wait/notify外,还可以利用Java并发库提供的高级工具,如`ExecutorService`,`CountDownLatch`,`CyclicBarrier`等,来更优雅地实现生产者消费者模型。例如,可以使用`...
Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...
总结来说,“java多线程(生产者与消费者)”是关于如何在Java中使用同步、线程间通信和共享资源来实现高效且安全的并发编程。通过理解并熟练应用这些概念和工具,开发者可以构建出能够充分利用多核处理器能力的高...
在Java编程中,生产者消费者模型是一种典型的多线程问题,用于解决资源的共享和并发控制。这个模型中,生产者负责生成数据,而消费者负责消耗这些数据。在这个项目中,开发者利用`synchronized`关键字来实现线程同步...
Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...
例如,在生产者-消费者模型中,生产者线程在向共享缓冲区添加元素时可能会调用`wait()`,直到有空闲空间可用。消费者线程在移除元素后会调用`notify()`或`notifyAll()`来唤醒一个或所有等待的生产者线程,告知它们...
生产者线程在生产完产品后调用`notify()`或`notifyAll()`唤醒消费者线程,消费者线程在消费完产品后调用`wait()`进入等待状态。 - `Semaphore`信号量:控制同时访问特定资源的线程数量。 - `CyclicBarrier`循环...
Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...
Java线程中的并发协作模型是多线程编程中一个核心的概念,它主要通过生产者消费者模型来体现。在这个模型中,生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。为了保证线程之间的协作和数据的一致性...
总的来说,Java中的生产者-消费者模型是通过线程同步机制实现的,主要涉及`synchronized`关键字和`wait()`, `notify()`, `notifyAll()`方法,以及各种缓冲区策略,如双缓冲区,来保证线程安全和高效的数据处理。...
举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,...
为了解决生产者和消费者之间的问题,Java提供了一系列的同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及高级的BlockingQueue接口。 首先,我们要理解生产者消费者模型的基本概念。在该...
在Java中实现生产者-消费者模型时,通常会用到`java.lang.Thread`类或`java.util.concurrent.ExecutorService`接口来创建和管理线程,同时利用`synchronized`关键字、`wait()`、`notify()`或`notifyAll()`方法来实现...
### Java多线程-生产者与消费者问题 #### 一、生产者与消费者问题概览 **1.1 概要** 生产者与消费者问题是计算机科学中一个多线程同步的经典问题。它描述了两个线程如何共享有限资源的场景:一个是生产者...
例如,在生产者-消费者模型中,生产者线程可以使用wait()方法等待消费者线程的唤醒,而消费者线程可以使用notify()或notifyAll()方法唤醒生产者线程。 wait、notify、notifyAll方法是Java多线程编程中非常重要的...