Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实时处理传入的数据流_Java - Fatal编程技术网

Java 实时处理传入的数据流

Java 实时处理传入的数据流,java,Java,我读了一个数字文件,我想点击一个按钮。单击按钮时,数字将输出平均值,而不仅仅是数字,而不会中断传入的数据流 也就是说,我想实时操纵流。这就是我想知道的 如何做到这一点 Ty我想你要找的是一种简单的方法,用实时数据流取平均值 您可以这样做: 私有整数和=0; 私有整数n=0;//已读取的NUM数 func(){ while / for: nextNum = // code to read number in a loop sum += nextNum; n++; } 然后您可以使用事件处

我读了一个数字文件,我想点击一个按钮。单击按钮时,数字将输出平均值,而不仅仅是数字,而不会中断传入的数据流

也就是说,我想实时操纵流。这就是我想知道的

如何做到这一点


Ty

我想你要找的是一种简单的方法,用实时数据流取平均值

您可以这样做:

私有整数和=0; 私有整数n=0;//已读取的NUM数

func(){
 while / for:
 nextNum = // code to read number in a loop
 sum += nextNum;
 n++;
}
然后您可以使用事件处理程序捕获按钮单击事件 点击按钮,您可以返回avg=sum/n

然而,正如Neil所指出的,如果您想要不间断的流,并且避免争用情况,那么您应该使用线程


编辑:我所说的竞态条件是指,假设您在总和值更新但n未更新时单击。在这种情况下,您将得到错误的平均结果。

这里是一个概念验证应用程序。它使用一个
SwingWorker
从0计数到99,每次增加一个小的延迟。该按钮开始计数,在计数期间,允许您使输出的数字加倍。请注意,类成员doubleMe被标记为
volatile
,因为它是跨线程读取的

注意,我使用Java8实现紧凑性

公共类大型机扩展JFrame{
私有静态最终长serialVersionUID=1L;
公共类WorkerTest扩展SwingWorker{
public volatile布尔doubleMe=false;
受保护的Void doInBackground()引发异常{
对于(int i=0;i{
if(worker==null | | worker.isDone()){
btn.setText(“切换双精度!”);
工人=新工人测试();
worker.addPropertyChangeListener(l->{
if(“state”.equals(l.getPropertyName())&&StateValue.DONE.equals(l.getNewValue())){
btn.setText(“开始!”);
}
});
worker.execute();
}否则{
worker.doubleMe=!worker.doubleMe;
}
});
添加(btn);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(()->{
MainFrame mf=新的MainFrame();
mf.setVisible(真);
});
}
}

在您的情况下,您将读取数字,而不是生成数字,但概念是相同的。doubleMe作为一种与线程通信的方式,在线程仍在工作时更改其行为。如果这回答了您的问题,请告诉我。

您想在读取数字的同时操纵正在读取的数字吗?这是可能的,但您必须这样做d使用线程执行读取,并能够在按下按钮时向其传递提示。它还必须是一个相当大的文件,才能在读取时有时间单击,除非您计划人为插入延迟。是的,我想要什么,我有延迟才能模拟事件。因此,我必须使用线程?一个解决方案将文件和另一个以某种方式实时处理输出的文件放在一起?请参考我的答案。简短的答案是肯定的,你必须使用线程,否则你无法从按钮触发更改。是的,问题不是获得平均值,而是按照你说的做。哇,谢谢。它符合我的想法。现在我必须测试它我自己的。我一会儿回来。