要求 - 使用实时流数据构建动画AreaChart.也许每1秒绘制300个数据点.
详细信息 - 因此,我需要从医疗设备读取患者呼吸模式的实时流数据,并使用JavaFX中的AreaChart以波形方式显示它.我是JavaFX的新手,因此我构建了一个小型POC,以了解JavaFX中的并发和动画是如何工作的.
这个概念有效,我对基本测试感到满意,就实现功能而言.但是我对下面代码中的性能表示不满意.
在下面的工作代码中,我创建了一个单独的线程来模拟从医疗设备获取数据.该线程只生成一个随机数并将其添加到ConcurrentLinkedQueue.
JavaFX Application线程通过时间轴从队列中提取此数据,并将其添加到AreaChart系列.
这种类型为我提供了我需要的动画,并且在运行时添加了数据.您可以复制粘贴此代码并对其进行测试.它应该可以正常工作.
但性能并不令人印象深刻 - CPU使用率达到56% - 我的笔记本电脑上有一块Intel Core 2 Duo @ 2.53 GHZ和4GB内存.我的显卡是采用最新驱动程序的Mobile Intel 4 Series express.
如何改进此动画或绘制实时数据,以获得更好的性能?
注意:如果它是瓶颈,我愿意在动画上妥协.我对这里显示的实现开放了 http://smoothiecharts.org/,其中波形只是预构建,只是从右到左流式传输.
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.SequentialTransition;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Series;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
* A chart that fills in the area between a line …
Run Code Online (Sandbox Code Playgroud) 这个片段来自JCIP(Brian Goetz),列出6.15
f.get()抛出InterruptedException和ExecutionException.现在,这些例外是否具体到未来正确?意味着未来所代表的特定任务被中断或具有内部异常.
问题 -
为什么我需要使用"Thread.currentThread().interrupt()"恢复中断?,因为我的任务运行的线程不是中断标志?这有点令人困惑.
为什么抛出washderThrowable异常?如果其中一个downloadImage有问题,我们不应该只处理从这里投掷的其他下载图像,因此只是"不"处理剩余的期货吗?
package net.jcip.examples;
import java.util.*;
import java.util.concurrent.*;
import static net.jcip.examples.LaunderThrowable.launderThrowable;
/**
* Renderer
* <p/>
* Using CompletionService to render page elements as they become available
*
* @author Brian Goetz and Tim Peierls
*/
public abstract class Renderer {
private final ExecutorService executor;
Renderer(ExecutorService executor) {
this.executor = executor;
}
void renderPage(CharSequence source) {
final List<ImageInfo> info = scanForImageInfo(source);
CompletionService<ImageData> completionService =
new ExecutorCompletionService<ImageData>(executor);
for (final ImageInfo imageInfo : info)
completionService.submit(new Callable<ImageData>() { …
Run Code Online (Sandbox Code Playgroud)我有一个与java线程相关的问题.
举一个非常简单的例子,假设我有2个线程.
线程正在运行的StockReader类实例
线程B运行StockAvgDataCollector类实例
在线程B中,StockAvgDataCollector连续收集一些市场数据,进行一些重度平均/操作并更新成员变量spAvgData
在线程A中,StockReader可以使用getspAvgData()方法访问StockAvgDataCollector实例及其成员spAvgData.
因此,线程A仅执行READ操作,线程B执行READ/WRITE操作.
问题
现在,在这种情况下,我是否需要同步或原子功能或锁定或任何与并发相关的东西?如果线程A读取较旧的值无关紧要.
由于线程A仅进行READ而不更新任何内容,并且只有线程B执行任何WRITE操作,是否会出现任何死锁情况?
我在以下链接中粘贴了以下段落.从该段开始,似乎我需要担心某种锁定/同步.
http://java.sun.com/developer/technicalArticles/J2SE/concurrency/
读/写锁
使用线程从对象读取数据时,您不一定需要阻止另一个线程同时读取数据.只要线程只是读取而不是更改数据,就没有理由不能并行读取.J2SE 5.0 java.util.concurrent.locks包提供了实现此类锁定的类.ReadWriteLock接口维护一对关联的锁,一个用于只读,一个用于写入.只要没有编写器,readLock()可以由多个读取器线程同时保持.writeLock()是独占的.虽然从理论上讲,很明显使用读取器/写入器锁来增加并发性会导致性能提高而不是使用互斥锁.然而,这种性能改进只能在多处理器上完全实现,并且与被修改的数据相比,读取数据的频率以及读取和写入操作的持续时间.
哪个并发实用程序在我的示例中更便宜且更合适?
java.util.concurrent.atomic?
java.util.concurrent.locks?
java.util.concurrent.ConcurrentLinkedQueue? - 在这种情况下,StockAvgDataCollector将添加并且StockReader将删除.不会暴露getspAvgData()方法.
谢谢阿米特
我正在使用Java 6设计一个工具,它将从医疗设备中读取数据.
每个医疗设备制造商都实施自己的固件/协议.供应商(像我一样)编写自己的界面,使用制造商的固件命令从医疗设备获取数据.大多数固件会以神秘的方式输出数据,因此接收它的供应商应该通过对其进行一些计算来对其进行扩展,以便计算出真实值.
可以安全地假设医疗数据的精确度与财务数据的精确度等同等重要.
我得出结论使用BigDecimal进行所有数值计算并存储最终值.我几乎每秒都会收到一组新的数据,这意味着,我将每秒进行计算并更新相同的值集.示例:每次呼吸时来自呼吸机的数据.
由于BigDecimal是不可变的,我担心每秒在堆中生成的对象数.特别是因为该工具必须扩展以同时从50个设备读取数据.
我可以增加堆大小和所有这些,但仍然是我的问题....
问题
我可以使用BigDecimal的任何可变表兄吗?
是否有任何现有的开源框架可以做这样的事情?
Java是否是这种功能的正确语言?
我应该看看Apfloat吗?但Apfloat也是不可改变的.JScience怎么样?
我可以使用任何Java数学库来实现高精度
我的目标是精度高达10位数.不需要更多.那么这种精度的最佳库或行动方案是什么?
题
使用 JAXB 编组时如何消除出现在所有元素和属性上的自动生成的命名空间前缀
我已经在编组和预期输出后演示了我当前的 XML 输出。
细节
我正在使用 JDK 1.6 更新 21 提供的默认 JaxB 实现(Metro)。
我的 XSD 文件如下所示。我使用 xjc 为这个 XSD 生成 Java 类,我不想在生成的 Java 类中添加/更改任何注释,以便我可以继续使用 xjc。
在代码中,这就是我编组的方式......在那里我使用 ObjectFactory 等创建 MYJAVAOBJECTTREE ......
JAXBContext jcDXD = JAXBContext.newInstance(MDASJ.class);
QName qn=new QName(XMLDataFormat.XML_ROOT_NAME);
marshallerDXD = jcDXD.createMarshaller();
marshallerDXD.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshallerDXD.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-1");
marshallerDXD.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.theronyx.com/mdasj/xmldata mdasj-data.xsd");
jaxbElementDXD = new JAXBElement<MDASJ>(qn, MDASJ.class, MYJAVAOBJECTTREE);
marshallerDXD.marshal(jaxbElementDXD, System.out);
Run Code Online (Sandbox Code Playgroud)
XSD 文件
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.theronyx.com/mdasj/xmldata" xmlns="http://www.theronyx.com/mdasj/xmldata">
<!-- definition of attributes -->
<xs:attribute name="ID" type="xs:string"/>
<xs:attribute name="ComputerTime" type="xs:string"/>
<xs:attribute name="VarId" type="xs:string"/>
<xs:attribute name="Value" …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Java Service Wrapper (tanukisoftware) 在 centos linux 机器上运行我的 java 服务器。我的 java 代码使用 System.getenv 访问了几个环境变量
当我在没有包装器的情况下运行程序(如 ant run)时,我可以访问我的环境变量,但是当我通过包装器执行它时,我不能(服务 XX 控制台)
所以我放弃并定义了我在 wrapper.conf 中定义的属性。这解决了我在java代码中的环境问题。
但后来我意识到我的 log4j.xml 也有一些环境变量引用。并且由于环境变量无法通过包装器获得,因此我的日志记录不起作用。
所以我必须解决并通过包装器使环境变量可用。
有趣的是,当作为服务运行时,我的 wrapper.conf 在 Windows 机器上工作,我可以访问环境变量......只是它不适用于 linux env。
下面是我用于两种环境的 wrapper.conf。
#encoding=UTF-8
# Configuration files must begin with a line specifying the encoding
# of the file.
#********************************************************************
# Wrapper License Properties (Ignored by Community Edition)
#********************************************************************
# Professional and Standard Editions of the Wrapper require a valid
# License Key to start. Licenses can …
Run Code Online (Sandbox Code Playgroud) Windows 7 64位,intellij 14 16 GB RAM,1 2GHZ CPU,2核
我有一个巨大的遗留项目,可能有60个模块,我用intellij打开.我只用它来查看东西.我不需要改变任何东西.
每当我打开它时,Intellij都会通过Indexing和VCS刷新历史舞蹈,这需要一段时间并减慢一切.
由于没有什么变化真的,我不希望它每次打开时都做索引和刷新历史记录.
操作系统 - Windows 7专业版64位
GIT for Windows - Git-1.9.0 - 使用Git bash
我开始突然出现"git fetch"的问题.
有时git.exe会出错,有时"git fetch"会挂起.
所以我决定从头开始一切.
我卸载了Windows的git并重新安装它(接受所有默认值),重新启动机器.创建了一个全新的文件夹并执行了以下操作
$ git clone git@github.com:myid@example.com/myproject.git
Cloning into 'myproject'...
Enter passphrase for key '/c/Users/myid/.ssh/id_rsa':
remote: Counting objects: 287209, done.
remote: Compressing objects: 100% (86467/86467), done.
remote: Total 287209 (delta 188451), reused 287209 (delta 188451)
Receiving objects: 100% (287209/287209), 168.89 MiB | 328.00 KiB/s, done.
Resolving deltas: 100% (188451/188451), done.
Checking connectivity...
Run Code Online (Sandbox Code Playgroud)
它始终只是挂起"检查连接"
我已经扫描了机器上的病毒/特洛伊木马你有没有发现任何威胁.
这种情况发生在工作地点和家里 - 所以它可能不是互联网.
我不确定如何继续或下一步尝试.
举个例子,假设我有一个customerX.xml文件,我已经使用JAXB(或XStream)解组了.
我在Java对象中更新此客户的电话号码,然后将内容编组回同一个customerX.xml
这是 一个旧的jaxb xml更新示例,从2003年开始.但是可能有更好的方法.
问题
编组将写入文件的所有内容,虽然我只是更新单个元素?如果是,那么有没有更好的方法来使用JAXB或XStream编组和更新XML文件的特定元素?
如果多个线程可能编组到同一个XML文件,如何使编组操作线程安全?
Env - C on CentOs,glib 2.5
我从我的信号处理程序中调用了一个日志功能.我想我正在使用所有异步信号安全功能.我的信号处理程序被调用两次并在localtime_r上被锁定.我需要做些什么来解决这个问题?
我的日志功能如下所示.如果格式化关闭,我道歉.
/**
* Following async signal safe functions are used
* fstat, time, localtime_r, asctime_r, rename, open, write, close
*
*/
void sysLog( Sint8 *fname, Sint32 tskId, Sint32 logType, const char *format, ...)
{
FILE *fp;
time_t sysTime;
va_list args;
struct stat fStat;
mode_t usrMask;
Sint8 tmpStg[256];
char newFileName[256];
char localtimestamp[256];
struct tm newtime;
int pfd;
//-- to sprintf base header and main msg into buffers before write
char logTimeEtc[255];
char logMainMsg[1000];
//Startup …
Run Code Online (Sandbox Code Playgroud) 有没有办法从AreaChart中删除符号?LineChart和ScatterChart具有该功能,但AreaChart中没有任何功能.
或者,如果我可以在LineChart(如在AreaChart中)下面的区域"填充"绘画,我也可以使用它.
我的目标是构建一个没有符号的AreaChart - 无论是使用lineChart(以某种方式填充它下面的区域)还是AreaChart - 都无关紧要......
谢谢