zoukankan      html  css  js  c++  java
  • Guarded Suspention 要等到我准备好

    线程在运行过程中需要停下来等待,然后再继续执行。

    范例程序,一个线程(ClientThread)对另外一个线程(ServerThread)传递请求,实现一个模拟消息通道的功能。

    public class GuardedSuspensionTest {
    	public static void main(String[] args) {
    		RequestQueue queue = new RequestQueue();
    		ClientThread ct = new ClientThread(queue, "Alice's Client");
    		ServerThread st = new ServerThread(queue, "Bobby's Server");
    		
    		ct.start();
    		st.start();
    	}
    }
    
    class ServerThread extends Thread{
    	private RequestQueue requestQueue;
    	
    	public ServerThread(RequestQueue requestQueue, String name){
    		super(name);
    		
    		this.requestQueue=requestQueue;
    	}
    
    	@Override
    	public void run() {
    		for(int i=0;i <10;i++){
    			Request request=requestQueue.getRequest();
    			System.out.println(Thread.currentThread().getName() + " handles " + request);
    			Thread.yield();
    		}
    	}
    }
    
    class ClientThread extends Thread{
    	private RequestQueue requestQueue;
    	
    	public ClientThread(RequestQueue requestQueue, String name){
    		super(name);
    		
    		this.requestQueue=requestQueue;
    	}
    
    	@Override
    	public void run() {
    		for(int i=0; i<10;i++){
    			Request request = new Request("No." + i);
    			System.out.println(Thread.currentThread().getName() + " requests " + request);
    			requestQueue.putRequest(request);
    			
    			Thread.yield();
    		}
    	}
    }
    
    class RequestQueue{
    
    	private final LinkedList<Request> queue = new LinkedList<Request>();
    
    	public synchronized Request getRequest(){
    		while(queue.size()<=0){
    			try {
    				wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		return queue.removeFirst();
    	}
    	
    	public synchronized void putRequest(Request request){
    		queue.addLast(request);
    		notifyAll();
    	}
    }
    
    class Request{
    	private final String name;
    	public Request(String name){
    		this.name=name;
    	}
    	public String getName(){
    		return name;
    	}
    
    	@Override
    	public String toString() {
    		return "[Request name:" + name + "]";
    	}
    }
    

      

  • 相关阅读:
    springmvc简介
    AOP的通知类型和注解配置
    word技巧之将目录放置文档的左侧
    【刷题-LeetCode】151 Reverse Words in a String
    【刷题-LeetCode】148 Sort List
    【刷题-LeetCode】150 Evaluate Reverse Polish Notation
    【刷题-LeetCode】147 Insertion Sort List
    【经验总结-博客园】博客园Silence主题模板使用
    【数学】立个flag
    python面试题
  • 原文地址:https://www.cnblogs.com/gaotianle/p/3307689.html
Copyright © 2011-2022 走看看