java中多线程一个线程负责客户端读数据到队列另外一个线程负责从队列输出数据

  直接上码分析

      

package test;

import java.applet.Applet;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingQueue;

import test.Test7.Input;
import test.Test7.Resolve;

public class Test6{
 
private static Queue queue = new LinkedBlockingQueue();//定义一个队列来存储数据

static class Input extends Thread{// 接收控制台输入
	
  public void run(){
		String name = null;
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入字符串:");
		
		while(true){
			name=sc.nextLine();
			// 如果立即可行且不违反容量限制,
			// 则将指定的元素插入此双端队列表示的队列中(即此双端队列的尾部),
			// 并在成功时返回 true;如果当前没有空间可用,则返回 false
			queue.offer(name);
			if ("exit".equals(name))
			break;
			synchronized (queue){//notify()是Object()中定义的方法所以只能用在synchronized()方法中。
				queue.notify();//唤醒在负责输出线程中的等待的告诉队列中有元素了它可以输出了
			}
		}
	}
}

  static class Test14 extends Thread{
	public void run(){
		while(true){
			if(queue.size()>0){
				//System.out.println(queue.size());
				String name = queue.poll();
				System.out.println(name);
			}
			
		else{
			synchronized (queue){
				try {
					queue.wait();//相当于queue.wait(0),队列中没有东西则默认无限等待直到队列中有东西并且通知他
				}catch (InterruptedException e) {
					
					e.printStackTrace();
				}//如果队列中没有东西则等待
			}
		 }

	}
		
	}
	
}

public static void main(String[] args) {
  new Input().start();
  new Test14().start();
}

}

输入线程输入输出线程读出运行截图

java中多线程一个线程负责客户端读数据到队列另外一个线程负责从队列输出数据_第1张图片


如果输入线程中没有
synchronized (queue){
	queue.notify();
}那么输出线程将会一直等待,所以必须输入线程通知输出线程队列里面有内容了可以输出东西了它才会被唤醒。

     如下图:输出线程没有输出处于一直等待

java中多线程一个线程负责客户端读数据到队列另外一个线程负责从队列输出数据_第2张图片

你可能感兴趣的:(java)