当前位置: 首页 > news >正文

java 开启线程扫描程序_当多个线程在Java中使用System.in上的扫描仪...

我尝试了以下代码(在main方法中):

Scanner scan = new Scanner(System.in);

new Thread(){

public void run(){

Scanner scan = new Scanner(System.in);

while(true){

if(scan.hasNext())System.out.println("Thread:"+scan.nextLine());

}

}

}.start();

while(true){

if(scan.hasNext())System.out.println("Main:"+scan.nextLine());

}

在大多数情况下,两个线程都不在打印,并且在打印时,很显然它们都在同时解析输入.尽管它们并没有以重复的字符结尾(但我认为),但是输入abcd可能会将ac发送到一个线程的扫描程序,将bd发送给另一个线程.

样例运行(任何未输入Main:或Thread:的输入):

abcdefghi

jklmnopqr

Thread:ghi

Thread:mnopqr

stuvwxyzA

Thread:vwxyzA

BCDEFGHIJ

KLMNOPQRS

Thread:KLM

Main:abcdefjklstuBCDEFGHIJ

TUVWXYZ`~

1!2@3#4$5

Main:NOPQRS~

Thread:TUVWXYZ`1!2@3#4$5

如果您希望两个线程都获取标准输入,则可以创建一个这样的类(它可以工作,但根本不是最佳选择):

class STDIN extends Thread{ //this way, it can only be used once, like intended.

private static final BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));

private static final ArrayList data = new ArrayList<>();

private static final ArrayList dataFlags = new ArrayList<>();

public void run(){

while(true){

synchronized(data){

try {

int i = stdin.read();

if (i == -1) break;

data.add(i);

} catch (IOException ex) {

ex.printStackTrace();

}

synchronized(dataFlags){

if (dataFlags.get(0) == 3){

dataFlags.remove(0);

data.remove(0);

}

}

}

}

try {

stdin.close();

} catch (IOException ex) {

ex.printStackTrace();

}

}

public int getByte(int index){

synchronized(data){

return data.get(index);

}

}

public void flagA(int index){

synchronized(dataFlags){

if (index>dataFlags.size()){

dataFlags.add(1);

}

else{

dataFlags.set(index, dataFlags.get(index) | 1);

}

}

}

public void flagB(int index){

synchronized(dataFlags){

if (index>dataFlags.size()){

dataFlags.add(2);

}

else{

dataFlags.set(index, dataFlags.get(index) | 2);

}

}

}

}

使用它,您可以读取数据,但一次只能读取一个字符.完成数据处理后,您可以根据所处的线程对其进行标记. (一个线程的flagA,另一个线程的flagB).

这是Scanner的部分包装.我只包括nextLine方法:

class MultithreadedScanner {

private final Scanner scan;

private final ArrayList toNotify;

public MultithreadedScanner(InputStream is) {

scan = new Scanner(is);

toNotify = new ArrayList<>();

}

public void addMultithreadedScannerListener(MultithreadedScannerListener l) {

synchronized (toNotify) {

toNotify.add(l);

}

}

public void nextLine() {

String s = scan.nextLine();

synchronized(toNotify){

for (MultithreadedScannerListener l: toNotify){

l.receiveNextLine(s);

}

}

}

}

interface MultithreadedScannerListener {

public void receiveNextLine(String line);

}

使每个要在实现MultithreadedScannerListener上监听标准输入的线程,并将它们添加到MultithreadedScanner.需要新信息时,请致电nextLine;建议仅从一个线程执行此操作.

相关文章:

  • java中结构体实现_JAVA中如何实现C中的结构体数组的功能?
  • java nio close_wait_Java NIO 操作总结
  • java zmq订阅_java zmq消息队列
  • java按键数据库添加_详解Java MyBatis 插入数据库返回主键
  • java ee jdbc_JavaEE JDBC 补充注意点
  • java 返回前台excel_Java后台读取excel表格返回至Web前端
  • eclipse for java web_【Javaweb】Eclipse for JavaEE新建的Web工程自动生成web.xml
  • gopython 获取python 全局线程锁失败_python线程互斥锁递归锁死锁
  • java collections 复制_Java公开课|Java Collections类查复制操作是你学习Java的超车途径,还不来看看就晚了...
  • java 线程的移动问题_Spring Boot中的多线程问题和ThreadLocal
  • Java 经常用到access_用Java连接到Microsoft Access 2007数据库的正确方法是什么?
  • java1.8 interface_JDK1.8新特性——FunctionInterface
  • php file_get_contents 中文,php file_get_contents函数怎么用
  • php 平均下载速度,php限制下载速度的实现方法
  • docker lamp php7,环境准备:docker-compose安装 LAMP、LNMP、php扩展
  • CentOS 7 防火墙操作
  • laravel5.5 视图共享数据
  • LeetCode18.四数之和 JavaScript
  • Linux链接文件
  • maven工程打包jar以及java jar命令的classpath使用
  • Spring框架之我见(三)——IOC、AOP
  • windows下使用nginx调试简介
  • yii2权限控制rbac之rule详细讲解
  • 多线程事务回滚
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 理解在java “”i=i++;”所发生的事情
  • 事件委托的小应用
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 如何在招聘中考核.NET架构师
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #pragma data_seg 共享数据区(转)
  • #每日一题合集#牛客JZ23-JZ33
  • $.ajax,axios,fetch三种ajax请求的区别
  • (12)Linux 常见的三种进程状态
  • (26)4.7 字符函数和字符串函数
  • (arch)linux 转换文件编码格式
  • (超详细)语音信号处理之特征提取
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ***利用Ms05002溢出找“肉鸡
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理(一):@echo off
  • .FileZilla的使用和主动模式被动模式介绍
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET/C# 使窗口永不获得焦点
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @WebService和@WebMethod注解的用法
  • [ SNOI 2013 ] Quare