Java 8 Java8流在并行流中终端操作上的自定义SWT侦听器内失败

Java 8 Java8流在并行流中终端操作上的自定义SWT侦听器内失败,java-8,swt,Java 8,Swt,终端操作上自定义SWT侦听器内的Java8流失败。 在本机实现的侦听器中使用时成功 主要区别在于,一个是使用org.eclipse.swt.widgets.Control.setMenu(菜单菜单)应用的。我感觉这是一个无效的线程访问问题,与Java8如何使用线程池创建并行流线程有关 捕获异常: org.eclipse.swt.SWTException: Unspecified error at sun.reflect.NativeConstructorAccessorImpl.newI

终端操作上自定义SWT侦听器内的Java8流失败。
在本机实现的侦听器中使用时成功

主要区别在于,一个是使用org.eclipse.swt.widgets.Control.setMenu(菜单菜单)应用的。我感觉这是一个无效的线程访问问题,与Java8如何使用线程池创建并行流线程有关

捕获异常:

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());
public SelectionListener menuSelectionListener = new SelectionListener() {

        @Override
        public void widgetSelected(SelectionEvent arg0) {
                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());
}
@覆盖
公共无效mouseDown(MouseEvent e){
if(例如,表的小部件实例){
tableRightClicked=(表)e.widget;
右键单击位置=新点(e.x,e.y);
如果(e.button!=1){//用户右键单击表格!显示表格菜单
if(Constants.debug)System.out.println(“在表中单击鼠标右键”);
Stream resourceAvail=scenarioMap.get(“5年2016年3月1.Single Source”).availabilityData.parallelStream().filter(availability->availability.resourceID.equals(“3004”);
System.out.println(“resourceAvail计数:+resourceAvail.count());
失败实例:

@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());
public SelectionListener menuSelectionListener = new SelectionListener() {

        @Override
        public void widgetSelected(SelectionEvent arg0) {
                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());
}
public-SelectionListener-menuSelectionListener=new-SelectionListener(){
@凌驾
公共无效widgetSelected(SelectionEvent arg0){
Stream resourceAvail=scenarioMap.get(“5年2016年3月1.Single Source”).availabilityData.parallelStream().filter(availability->availability.resourceID.equals(“3004”);
System.out.println(“resourceAvail计数:+resourceAvail.count());
}
---代码使用单线程流,访问自定义侦听器也会阻止额外线程?为什么只在终端操作上?

我认为(暂定)这里有两个问题:导致java并行流调用
reportException
,这可能是次要的或明显的,然后当它试图在java平台的本机代码层创建异常时,出现了一些不好的情况。它看起来像是在尝试实例化native SWT通过反射和失败实现异常类

我想整个scenarioMap/ToolsetAvailability都是应用程序域的一部分,与GUI无关。如果其中有特定于SWT的代码,这可能就是问题所在;本机GUI层可能不喜欢在意外的线程中实例化GUI对象


否则,我假设您已检查代码是否使用
availabilityData.stream()
而不是
availabilityData.parallelStream()工作
?如果没有,那么这样做可能会向您显示由于其他问题而在并行情况下没有报告的根错误。

SWT文档中关于多线程访问的说明是什么?进一步提出了问题。您是否有明确的理由首先使用并行流,还是仅仅因为它“似乎是个好主意"?GUI工具包通常广泛使用线程限制;在这里,您将执行喷洒到随机线程上,这些线程可能会访问本应限制在GUI线程内的内容。这几乎肯定是问题所在。课程:并行是高级情况下的高级工具。我相信您已经掌握了一些知识-java8并行流使用类中的公共fork-join线程池。在java8中,是否因为使用线程池而对并行线程进行了额外的标记?为了完整性,标记作为答案。干杯