标签:设计模式 模式 pattern java多线程 多线程模式
多线程共享一个资源,该资源的使用是有条件的。
共享资源的占用是有条件而非直接占用的。
幼教收作业:仨熊孩子俩幼教,俩幼教面前一个长桌子,总共只能放两个作业。
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();
}
}
}本文出自 “JAVA技术栈笔记” 博客,请务必保留此出处http://stroll.blog.51cto.com/11038467/1855761
JAVA多线程(五)模式-Guarded Suspension
标签:设计模式 模式 pattern java多线程 多线程模式
原文地址:http://stroll.blog.51cto.com/11038467/1855761