1.基础类:简单的对num的操作,注意同步
public class SynStackNum {
private int num = 0;
public synchronized void printAdd(String threadName) {
num++;
System.out.println("生产线程: "+ Thread.currentThread().getName()+",threadName="+threadName+", 生产 num ="+num);
}
public synchronized void printDel(String threadName) {
num--;
System.out.println("消费线程: "+Thread.currentThread().getName()+",threadName="+threadName+", 消费 num ="+num);
}
public synchronized int getNum() {
return num;
}
public synchronized void setNum(int num) {
this.num = num;
}
}
2.然后是生产者:
public class ProductThread implements Runnable {
private SynStackNum c;
public String name;
public ProductThread(String name, SynStackNum c) {
this.name = name;
this.c = c;
}
@Override
public void run() {
while (true) {
synchronized (c) {
if (c.getNum() >= 10) {
try {
System.out.println(getClass() + ",数据过多,增加操作 wait...");
c.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
c.printAdd(name);
c.notify();
System.out.println(this.getClass() + ",增加 notify.........");
try {
// Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public synchronized SynStackNum getC() {
return c;
}
public synchronized void setC(SynStackNum c) {
this.c = c;
}
}
3.消费者:
package com.my.thread;
public class ComsumThread implements Runnable {
public String name;
private SynStackNum c;
public ComsumThread(String name, SynStackNum c) {
this.name = name;
this.c = c;
}
@Override
public void run() {
while (true) {
synchronized (c) {
try {
// 让当前线程等待,即持有当前对象锁的线程等待
if (c.getNum() <= 1) {
System.out.println(getClass() + ",没有数据,删除操作 wait...");
c.wait();
}
// Thread.sleep(1000);
c.printDel(name);
c.notify();
System.out.println(getClass() + ",删除... notify...........");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public synchronized SynStackNum getC() {
return c;
}
public synchronized void setC(SynStackNum c) {
this.c = c;
}
}
3.测试主线程:
public class Main {
private SynStackNum c = new SynStackNum();
public static void main(String[] args) {
new Main().start();
}
private void start() {
ComsumThread c1 = new ComsumThread("consum11", c);
ComsumThread c2 = new ComsumThread("consum22", c);
ProductThread p1 = new ProductThread("procdct11", c);
ProductThread p2 = new ProductThread("procdct22",c);
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(c1);
exec.execute(c2);
exec.execute(p1);
exec.execute(p2);
System.out.println("主线程结束 end..");
}
}
分享到:
相关推荐
在提供的“备忘录模式.rar”压缩包中,可能包含了实现备忘录模式的Java代码示例,包括发起人、备忘录和存档者的具体实现,以及如何在实际项目中使用这些组件的例子。学习这些代码可以帮助你更好地理解备忘录模式的...
备忘录模式(Memento Pattern)是软件设计模式中的一种,属于行为模式。它提供了一种方式来恢复对象到之前的状态,即“撤销”操作。备忘录模式的核心思想是保存对象的内部状态,以便在需要时能恢复到这个状态,而...
备忘录模式是一种在软件工程中广泛使用的面向对象设计模式,它主要用来安全地保存对象的状态,以便在需要时能够恢复到先前的状态。备忘录模式的核心思想是封装对象的状态,将其保存到一个独立的对象(备忘录)中,而...
在Java中,备忘录模式通常包括三个关键角色:原始对象(Originator)、备忘录(Memento)和管理者(Caretaker)。原始对象是需要保存状态的对象,它创建并存储在备忘录中的状态。备忘录负责存储原始对象的状态,而...
备忘录模式由三个主要角色组成:原发者(Originator)、备忘录(Memento)和管理者(Caretaker)。原发者是需要保存状态的对象,备忘录是存储原发者状态的数据结构,而管理者则负责创建、存储和管理备忘录,防止外部...
备忘录模式是一种在软件工程中广泛使用的结构型设计模式,其主要目的是为了在不破坏封装性的前提下,能够安全地保存对象的状态,并在需要时恢复到先前保存的状态。这种模式通常用于那些需要记录和回滚操作的重要场景...
备忘录模式(Memento Pattern)是软件设计模式中的一种行为模式,它的主要目的是在不破坏对象封装性的前提下,允许对象在特定时刻保存其内部状态,并能够在之后恢复到保存时的状态。这种模式广泛应用于撤销/重做功能...
在给定的压缩包文件"备忘录模式3"中,可能包含了实现上述概念的代码示例,包括发起人、备忘录和存档者的具体类定义,以及如何使用它们来记录和恢复状态的示例。通过详细阅读和理解这些代码,可以更好地掌握备忘录...
在C#中,备忘录模式通常包含三个角色:Originator(原发器)、Memento(备忘录)和CareTaker(管理者)。让我们逐一解析这些角色: 1. **Originator(原发器)**:这是使用备忘录模式的核心对象,它负责创建一个...
**Java设计模式——备忘录模式详解** 备忘录模式是一种行为设计模式,它允许对象在不破坏封装性的前提下捕获并存储...同时,备忘录模式与其他设计模式如工厂模式、观察者模式等结合使用,可以构建出更复杂的系统架构。
备忘录模式是一种设计模式,它在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将对象恢复到原先保存的状态。这种模式常用于需要记录用户操作或者游戏进度等场景,允许...
在Java中实现备忘录模式,我们通常会定义三个关键角色:原始对象(Originator)、备忘录(Memento)和照料者(Caretaker)。首先,原始对象创建并维护其状态,它知道如何创建备忘录,并且可以在需要时使用备忘录恢复...
在C++中,备忘录模式通常包含三个角色:发起人(Originator)、备忘录(Memento)和照料者(Caretaker)。发起人是创建和恢复状态的对象,备忘录负责存储发起人的状态,而照料者则负责管理备忘录,避免对发起人状态...
备忘录模式是一种设计模式,属于行为...在C#中,通过创建备忘录对象并由管理者进行管理和存储,我们可以有效地实现这一模式,提高代码的可维护性和灵活性。案例中的实现进一步说明了如何在实际项目中应用备忘录模式。
3. **照顾者(Caretaker)**:负责存储和传递备忘录,但不应该对备忘录的内容进行修改。 在实际应用中,备忘录模式的实现可以分为两种方式: - **窄接口备忘录**:备忘录只包含发起人需要恢复的关键状态,这减少了...
使用这个模式时,我们可以创建一个`GeneralObject`实例,然后在需要的时候创建备忘录并存储在照料者中: ```csharp public static void Main() { var obj = new GeneralObject("初始状态"); var caretaker = new ...
在实际应用中,备忘录模式可以与其他设计模式结合使用,比如观察者模式,当对象状态改变时,观察者接收到通知并更新备忘录。此外,备忘录模式还可以与命令模式结合,用于实现命令的撤销/重做功能。 总之,备忘录...
备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下,捕获和恢复一个对象的内部状态。在C++中实现备忘录模式,可以有效地帮助开发者在程序运行过程中保存对象的状态,以便在需要时恢复到之前的状态,这...
备忘录模式(Memento Pattern)是设计模式中的一种行为模式,主要目的是在不违反封装原则的情况下,保存一个对象的内部状态,以便在需要时能够恢复到先前的状态。这种模式通常用于实现撤销/重做功能或者在游戏中保存...