JAVA多线程(五)模式-Guarded Suspension

  • Guarded Suspension

  • 多线程共享一个资源,该资源的使用是有条件的。
    • 适用环境

      • 共享资源的占用是有条件而非直接占用的。
    • 样例

      • 幼教收作业:仨熊孩子俩幼教,俩幼教面前一个长桌子,总共只能放两个作业。
    • 熊孩子

    • package GuardedSuspension;
      
      public class Child implements Runnable {
      	private Table table=null;
      	private String myName=null;
      	private int cnt=1;
      	public Child(Table table,String myName){
      		this.table=table;
      		this.myName=myName;
      	}
      	@Override
      	public void run() {
      		while(cnt<=20){
      			Assignment a=new Assignment(this.myName,this.myName+"_"+cnt);
      			System.out.println(this.myName+" 交作业 "+cnt);
      			table.put(a);
      			cnt++;
      			try {
      				Thread.sleep(100);
      			} catch (InterruptedException e) {
      			}
      		}
      	}
      
      }
    • 幼教

    • package GuardedSuspension;
      
      public class Teacher implements Runnable{
      	private final String myName;
      	private final Table table;
      	private int state=0;
      
      	public Teacher(Table table ,String name){
      		this.myName=name;
      		this.table=table;
      	}
      
      	public void setState(int state){
      		this.state=state;
      	}
      	@Override
      	public void run() {
      		while(state==0){
      			Assignment a=table.get();
      			if(a!=null){
      				a.setResult(myName, "Y");
      				a.showResult();
      			}
      		}
      	}
      }
    • 桌子

    • package GuardedSuspension;
      
      import java.util.LinkedList;
      //guarded object
      public class Table {
      	private final LinkedList<Assignment> table=new LinkedList<Assignment>();
      	private final int size;
      	private int state=0;
      	public Table(int size){
      		this.size=size;
      	}
      	//guarded method
      	public synchronized void put(Assignment assignment){
      		while(table.size()>=size){
      			try {
      				wait();
      			} catch (InterruptedException e) {
      
      			}
      		}
      		table.add(assignment);
      		notifyAll();
      	}
      
      	//state change method
      	public synchronized Assignment get(){
      		Assignment ret=null;
      		while(table.size()<=0&&state==0){
      			try {
      				wait();
      				//wait(100); //如果并未在主线程对桌子状态进行最后的唤醒,需要是定时等待。
      			} catch (InterruptedException e) {
      
      			}
      		}
      		ret=table.poll();
      		notifyAll();
      		return ret;
      	}
      
      	public void setState(int state){
      		this.state=state;
      	}
      }
    • 作业

    • package GuardedSuspension;
      
      public class Assignment {
      	private final String childName;
      	private final String assignmentName;
      	private String teacherName="N/A";
      	private String result="N/A";
      
      	public Assignment(String childName,String assignmentName){
      		this.childName=childName;
      		this.assignmentName=assignmentName;
      	}
      	public void setResult(String teacherName,String result){
      		this.teacherName=teacherName;
      		this.result=result;
      	}
      
      	public void showResult(){
      		System.out.println("孩子:"+childName+"交给老师:"+teacherName+"的作业:"+assignmentName+"批改结果:"+result);
      	}
      }
    • 测试类

    • package GuardedSuspension;
      
      public class Test {
      
      	public static void main(String[] args) {
      
      		Table table=new Table(2);
      		Teacher t1=new Teacher(table,"t1");
      		Teacher t2=new Teacher(table,"t2");
      		Child c1=new Child(table,"c1");
      		Child c2=new Child(table,"c2");
      		Child c3=new Child(table,"c3");
      		Thread tChild1=new Thread(c1);
      		Thread tChild2=new Thread(c2);
      		Thread tChild3=new Thread(c3);
      
      		Thread tTeacher1=new Thread(t1);
      		Thread tTeacher2=new Thread(t2);
      
      		tChild1.start();
      		tChild2.start();
      		tChild3.start();
      		tTeacher1.start();
      		tTeacher2.start();
      		//等待孩子们完成所有锁也
      		try {
      			tChild1.join();
      			tChild2.join();
      			tChild3.join();
      		} catch (InterruptedException e) {
      		}
      		//如果在table类中,如果wait是定时的,则可以通过直接设置桌子状态table.setState(-1);来通知。
      		synchronized(table){
      			System.out.println("所有孩子已经离开了");
      			//设置老师状态
      			t1.setState(-1);
      			t2.setState(-1);
      			//获取table的锁后,变更其状态,同时通知所有等待在桌子旁的人离开。
      			table.setState(-1);
      			table.notifyAll();
      		}
      	}
      
      }
时间: 2024-11-16 03:40:31

JAVA多线程(五)模式-Guarded Suspension的相关文章

Java多线程Future模式

Java多线程Future模式有些类似于Ajax的异步请求Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 假设服务器的处理某个业务,该业务可以分成AB两个过程,并且AB两个过程之间不需要彼此的返回结果 A过程需要1秒钟,B过程需要2秒钟,主线程其他操作2秒钟按照正常编写,程序大概需要执行5秒如果按照Future模式只需要执行2秒(取其中运行时间最久的线程的运行时间) Future模式的核心实现在于两个方面 1.多线程运行 主线程采用多线的方

Java多线程Master-Worker模式

Java多线程Master-Worker模式,多适用于需要大量重复工作的场景中. 例如:使用Master-Worker计算0到100所有数字的立方的和 1.Master接收到100个任务,每个任务需要0到100中每个数字的立方,这里为了效果,每个任务再sleep一秒, Master需要将这些任务放到一个支持高并发的非阻塞队列queue中如:ConcurrentLinkedQueue<E>. 2.Master创建10个worker去执行这100个任务,并准备一个支持高并发且线程安全的hashMa

Java多线程编程模式实战指南之Promise模式

Promise模式简介(转) Promise模式是一种异步编程模式 .它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作.等到我们需要该任务的执行结果时,再调用凭据对象的相关方法来获取.这样就避免了不必要的等待,增加了系统的并发性.这好比我们去小吃店,同时点了鸭血粉丝汤和生煎包.当我们点餐付完款后,我们拿到手的其实只是一张可借以换取相应食品的收银小票(凭据对象)而已,而不是对应的实物.由于鸭血粉丝汤可以较快制作好,故我们

Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock

在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(ReentrantLock)以及读写锁(ReentrantReadWriteLock). 1. ReentrantLock 在Java多线程(二) 多线程的锁机制 里面,已经总结过通过使用Synchronized关键字实现线程内的方法锁定.但使用Synchronized关键字有一些局限性,上锁和释放锁是由JVM决定的

Java多线程编程模式实战指南(三):Two-phase Termination模式--转载

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它

Java多线程编程模式实战指南(二):Immutable Object模式--转载

本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-object.转载请注明作者: 黄文海 出处:http://viscent.iteye.com. 多线程共享变量的情况下,为了保证数据一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object模式使得我们可以在不使用锁的情况下,既保证共享变量访问的线程安

Java多线程编程模式实战指南(三):Two-phase Termination模式

停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程时还有一些额外的细节需要考虑,如待停止的线程处于阻塞(等待锁)或者等待状态(等待其它线程).尚有未处理完的任务等.本文介绍的Two-phase Termination模式提供了一种通用的用于优雅地停止线程的方法. Two-phase Termination模式简介 Java并没有提供直接的API用于停止线程.Two-phase Termination模式通过将停止线程这个动作分解为准备阶

Java多线程编程模式实战指南(一):Active Object模式--转载

本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-object-part1 .转载请注明作者: 黄文海 出处:http://viscent.iteye.com. Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心

Java多线程编程模式实战指南一:Active Object模式(上)

Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它允许任务的提交(相当于对异步方法的调用)和任务的执行(相当于异步方法的真正执行)分离.这有点类似于System.gc()这个方法:客户端代码调用完gc()后,一个进行垃圾回收的任务被提交,但此时JVM并不一定进行了垃圾回收,而可能是在gc()方法调用返回后的某段时间才开始执行任务--回收垃圾.我们知