Java8 Stream在终端操作中在自定义SWT侦听器内失败 在本机实现的侦听器中使用时成功。
主要区别在于使用 org.eclipse.swt.widgets.Control.setMenu(菜单菜单)来应用一个。我觉得这是一个无效的线程访问问题,与Java8如何使用线程池创建并行流线程有关。
发现异常:
Random rnd = new ConsistantRandom(yourSeed);
工作实例:
org.eclipse.swt.SWTException: Unspecified error
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.util.concurrent.ForkJoinTask.getThrowableException(Unknown Source)
at java.util.concurrent.ForkJoinTask.reportException(Unknown Source)
at java.util.concurrent.ForkJoinTask.invoke(Unknown Source)
at java.util.stream.FindOps$FindOp.evaluateParallel(Unknown Source)
失败的实例:
@Override
public void mouseDown(MouseEvent e) {
if (e.widget instanceof Table) {
tableRightClicked = (Table) e.widget;
rightClickLocation = new Point(e.x, e.y);
if(e.button != 1){//user right clicked table! display tableMenu
if(Constants.debug)System.out.println("RIGHT MOUSE BUTTON CLICKED IN TABLE");
Stream<ToolsetAvailability> resourceAvail = scenarioMap.get("5-Year Mar. 2016 1. Single Source").availabilityData.parallelStream().filter(availability -> availability.resourceID.equals("3004"));
System.out.println("resourceAvail count:"+resourceAvail.count());
---代码适用于单线程流,那么是否可以访问自定义侦听器阻塞额外的线程?为什么只在终端运营?
答案 0 :(得分:2)
我认为(暂时)这里有两个问题:有什么导致java并行流调用reportException
,这可能是次要的或显而易见的,然后当它试图创建时发生了一些不好的事情例外,在java平台的本机代码层中。看起来它正试图通过反射和失败来实例化本机SWT异常类。
我认为整个scenarioMap / ToolsetAvailability东西是与GUI分开的应用程序域的一部分。如果里面有特定于SWT的代码,那可能就是问题;本机GUI层可能不喜欢在意外的线程中实例化GUI对象。
否则,我假设您已使用availabilityData.stream()
而不是availabilityData.parallelStream()
检查了代码是否有效?如果没有,这样做可能会显示由于其他问题而在并行情况下未报告的根错误。