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 + "]";
    	}
    }
    

      

  • 相关阅读:
    elment ui 日期限制
    javascript中的编码与解码
    vue3 px 转ref
    css 波浪线
    初始化css
    vue 3 的复制功能 vue-clipboard3
    二维数组转一维数组、对象数组互斥去重
    分享几个数组方法
    前端生成图形验证码
    rem自适应布局,移动版
  • 原文地址:https://www.cnblogs.com/gaotianle/p/3307689.html
Copyright © 2011-2022 走看看