java中多线程一个线程负责客户端读数据到队列另外一个线程负责从队列输出数据
2017-03-28 13:31
761 查看
直接上码分析
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<String> 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();
}
}
输入线程输入输出线程读出运行截图
如果输入线程中没有
如下图:输出线程没有输出处于一直等待
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<String> 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();
}
}
输入线程输入输出线程读出运行截图
如果输入线程中没有
synchronized (queue){ queue.notify(); }那么输出线程将会一直等待,所以必须输入线程通知输出线程队列里面有内容了可以输出东西了它才会被唤醒。
如下图:输出线程没有输出处于一直等待
相关文章推荐
- java多线程:16、阻塞队列【BlockingQueue】实现线程数据共享的效果
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数(方法一)
- 用Java写一个多线程程序,如写四个线程,二个加1,二个对一变量减一,输出:
- Java 多线程中。两个线程交替执行,一个输出偶数,一个输出奇数(方法二)
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
- 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
- 面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数
- 用Java写一个多线程程序,如写四个线程,二个加1,二个对一变量减一,输出:
- Java多线程总结之线程安全队列Queue
- (13)多线程与并发库之java5阻塞队列(BlockingQueue)的应用----子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程循环100次,如此循环50次
- (13)多线程与并发库之java5阻塞队列(BlockingQueue)的应用----子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程循环100次,如此循环50次
- Java多线程(二)、启动一个线程的3种方式
- Java中将一个数据保留小数点后n位输出
- 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据
- java 多线程:开两个线程,一个线程跑同步代码块,一个线程跑同步函数
- 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据
- 初学Java多线程:从线程返回数据的两种方法
- windows多线程编程-----1.四个线程同时输出//一个文件( 没有参数+有参数 )
- 从文件中读入数据,排序并输出到另外一个文件中