Node.js 基础原理编程

Node.js 基础原理编程

第1题 Java实现两个线程读写队列

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.LinkedBlockingDeque;
public class TwoThreads {
     //Define a queue
    private static LinkedBlockingDeque<String> queue=new LinkedBlockingDeque<String>();
     //write data to queue     
    public static class Writer extends Thread {
        public void run(){
           BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
           String str=null;
           while(true){
               try {
                   str=reader.readLine();
                   queue.put(str);
                   //if input "exit" in Console, the Application exits.
                   if("exit".equals(str)){ 
                      break;
                  }
              } catch (InterruptedException | IOException e) {
                  e.printStackTrace();
              }    
          } 
        }
    }
    //read data from queue
    public static class Reader extends Thread {
        public void run(){
            String str=null;
                while(true){
                    try {
                        str=queue.take();
                        System.out.println(str);
                        if("exit".equals(str)){
                            break;
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
  	}
 
    public static void main(String[] args) throws IOException {
        Writer writer = new Writer();
        Reader reader = new Reader();
        writer.start();
        reader.start();
    }
}

第2题 用wait和notify改写上述代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.LinkedBlockingDeque;
public class TwoThreads {
    //Define a queue
    private static LinkedBlockingDeque<String> queue=new LinkedBlockingDeque<String>();
    //write data to queue
    class Writer extends Thread {
        public void run(){
            try {
                BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
                String str=null; 			
                while(true){  
                    str=reader.readLine();    				
                    queue.put(str);     				
                    //if input "exit" in Console, the Application exits.    				
                    if("exit".equals(str)){     					
                        break;
                    }
                    synchronized (queue) {
                        queue.notify(); 
                    }  
                }   
    		reader.close();
    	    }catch (InterruptedException | IOException e) {
    		e.printStackTrace();
    		}
    	}
    }
    //read data from queue
    class Reader extends Thread {
        public void run(){
            String str=null;
            while(true){
                if(queue.size()>0) {
                    str=queue.poll();
                    System.out.println(str);
                    if("exit".equals(str)){
                        break;
                        }
                }else {
                    synchronized (queue) {
                        try {
                            queue.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    public static void main(String[] args) throws IOException { 
        TwoThreads twothread = new TwoThreads();
        Writer writer = twothread.new Writer();
        Reader reader = twothread.new Reader();
        writer.start();
        reader.start();
    }    
}    

第3题 画出命令模式的静态类图
在这里插入图片描述

第4题 使用命令模式改写上述程序,使之实现事件的回调

// 基于Command模式编程
import java.util.concurrent.LinkedBlockingDeque;

public class Client {
   LinkedBlockingDeque<String> queue=new LinkedBlockingDeque<String>();
   Receiver receiverWriter = new ConcreteReceiverWriter();
   Receiver receiverWriter = new ConcreteReceiverWriter();
   Receiver receiverReader = new ConcreteReceiverReader();
   
   Invoker invoker = new Invoker();
   invoker.setCommand(new ConcreteCommandWriter(receiverWriter));
   invoker.action(queue);
   invoker.setCommand(new ConcreteCommandReader(receiverReader));
   invoker.action(queue);
import java.util.concurrent.LinkedBlockingDeque;

public abstract class Command {
    public abstract void execute(LinkedBlockingDeque<String> queue);
}
import java.util.concurrent.LinkedBlockingDeque;

public class ConcreteCommandReader extends Command{
    private Receiver receiver;
    public ConcreteCommandReader(Receiver receiver) {
    	this.receiver = receiver;
    }
    @Override
    public void execute(LinkedBlockingDeque<String> queue) {
	receiver.receiver(queue);
    }
}
import java.util.concurrent.LinkedBlockingDeque;
public class ConcreteCommandWriter extends Command{
    private Receiver receiver; 
    public ConcreteCommandWriter(Receiver receiver) {
    this.receiver = receiver;
    }
     @Override
    public void execute(LinkedBlockingDeque<String> queue) {
         receiver.receiver(queue);
    }
}
import java.util.concurrent.LinkedBlockingDeque;

public abstract class Receiver { 
      public abstract void receiver(LinkedBlockingDeque<String> queue); 
}
import java.util.concurrent.LinkedBlockingDeque;

public class ConcreteReceiverReader extends Receiver{
    @Override 
    public void receiver(LinkedBlockingDeque<String> queue) { 
        String str=null;
        while(true) {
            str=queue.poll();
            if("exit".equals(str)){
                   break;
             }
            System.out.println(str);
         } 
     }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.LinkedBlockingDeque;

public class ConcreteReceiverWriter extends Receiver{ 
    public LinkedBlockingDeque<String> queue=new LinkedBlockingDeque<String>();
    @Override
    public void receiver(LinkedBlockingDeque<String> queue) { 
        String str=null;
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        try {
            while(true){    
                str=reader.readLine();
                queue.put(str); 
                //if input "exit" in Console, the Application exits.
                if("exit".equals(str)){ 
                    break;
                }        
            } 
            reader.close();
        } catch (IOException | InterruptedException e) {
                e.printStackTrace();
        }  
     } 
}
import java.util.concurrent.LinkedBlockingDeque;

public class Invoker {
    private Command command;
    //Receive command
    public void setCommand(Command command){
        this.command = command;
    }
    //Execute action
    public void action(LinkedBlockingDeque<String> queue){
        this.command.execute(queue);
    }
}

第5题 模仿js定义事件及回调的语法,实现node.js中事件的监听与事件的触发。

package eventListener;

public class Demo {
 public static void main(String[] args) {
  //创建事件的一个监听
        EventEmitter emitter = new EventEmitter();       
        emitter.addListener("some_event",new EventListener(){
            @Override
            public void handleEvent(EventObject event) { 
             System.out.println("some_event事件触发,调用此回调");          
            }
        });
        //触发事件“openWindows”
        emitter.emit(new EventObject("some_event"));
 }
}
package eventListener;
import java.util.Vector;

public class EventEmitter {
 //Define listener list 
    private Vector<EventListener> ListenerList = new Vector<EventListener>();
    //Add listener to this List
    public void addListener(String some_event, EventListener eventListener) {
 	 ListenerList.add(eventListener);
 }
   //receive event
    public void emit(EventObject event){        
        for(EventListener eventListener:ListenerList){
                eventListener.handleEvent(event);
        }
    }
}
package eventListener;

public interface  EventListener extends java.util.EventListener {
 //handleEvent
    public void handleEvent(EventObject event);
}
package eventListener;

public class EventObject extends java.util.EventObject{ 
     private static final long serialVersionUID = 1L;
     public EventObject(Object source){
         super(source);
     }     
}

猜你喜欢

转载自blog.csdn.net/youozohoeonog/article/details/82796527
今日推荐