来自 Java 7 Update 25 的 rmi 线程的 AppContext 为空 [英] AppContext is null from rmi thread with Java 7 Update 25

查看:59
本文介绍了来自 Java 7 Update 25 的 rmi 线程的 AppContext 为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们最近从更新 21 更新到 Java 7 更新 25,现在当从 rmi 线程调用 SwingUtilities.isEventDispatchThread() 时遇到空指针异常,因为 AppContext.getAppContext() 返回 null.

We recently updated to Java 7 Update 25 from Update 21 and are now experiencing a null pointer exception when SwingUtilities.isEventDispatchThread() is called from an rmi thread becuase AppContext.getAppContext() is returning null.

java.lang.NullPointerException 在sun.awt.SunToolkit.getSystemEventQueueImplPP(来源不明)在sun.awt.SunToolkit.getSystemEventQueueImplPP(来源不明)在sun.awt.SunToolkit.getSystemEventQueueImpl(Unknown Source) atjava.awt.Toolkit.getEventQueue(Unknown Source) atjava.awt.EventQueue.isDispatchThread(Unknown Source) atjavax.swing.SwingUtilities.isEventDispatchThread(Unknown Source) at......在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) atsun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) atjava.lang.reflect.Method.invoke(Unknown Source) atsun.rmi.server.UnicastServerRef.dispatch(Unknown Source) atsun.rmi.transport.Transport$1.run(Unknown Source) atsun.rmi.transport.Transport$1.run(Unknown Source) atjava.security.AccessController.doPrivileged(Native Method) 在sun.rmi.transport.Transport.serviceCall(Unknown Source) atsun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) atsun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(未知来源)在sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(未知源)在 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown源)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown来源)在 java.lang.Thread.run(未知来源)

java.lang.NullPointerException at sun.awt.SunToolkit.getSystemEventQueueImplPP(Unknown Source) at sun.awt.SunToolkit.getSystemEventQueueImplPP(Unknown Source) at sun.awt.SunToolkit.getSystemEventQueueImpl(Unknown Source) at java.awt.Toolkit.getEventQueue(Unknown Source) at java.awt.EventQueue.isDispatchThread(Unknown Source) at javax.swing.SwingUtilities.isEventDispatchThread(Unknown Source) at ... ... at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) at sun.rmi.transport.Transport$1.run(Unknown Source) at sun.rmi.transport.Transport$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Unknown Source) at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

此错误仅在 Web 启动时出现,当我们通过 IDE 运行我们的应用程序时,没有问题.

This error is only present from web start, when we run our application through an IDE, it is fine.

有没有其他人遇到过这种情况?知道有关 AppContext 的最新更新中发生了什么变化吗?

Has anyone else ran into this? Any idea of what was changed in the latest update regarding AppContext?

似乎其他人在更新后遇到了一些与 AppContext 相关的问题:https://forums.oracle.com/message/11077767#11077767

It seems others are having somewhat related issues with AppContext after the update: https://forums.oracle.com/message/11077767#11077767

推荐答案

当 Java3D 作为 Java Web Start 运行时,我遇到了同样的问题.我找到了另一个解决方案.您必须使用可运行队列准备自己的 InvokeLaterProcessor.它必须扩展 Thread 并选择 runnables 并在 run 方法中处理它们:

I had the same problem with Java3D running as Java Web Start. I have found another solution. You have to prepare you own InvokeLaterProcessor with queue of runnables. It must extend Thread and pick ups runnables and process them in run method:

public class InvokeLaterProcessor extends Thread {

  private BlockingQueue<Runnable> queue=new ArrayBlockingQueue<Runnable>(1);

  public InvokeLaterProcessor(String name) {
    super(name);
  }

  public void invokeLater(Runnable runnable) {
    try {
      queue.put(runnable);
    } catch (InterruptedException ex) {
      log.warn("invokeLater interrupted");
    }
  }

  public void run() {
    Runnable runnable=null;
    do {
      try {
        runnable = queue.take();
        SwingUtilities.invokeLater(runnable);
      } catch (InterruptedException ex) {
        runnable=null;
      }
    } while(runnable!=null);
  }
}

你所要做的就是在主线程中创建的某个类的静态中创建它:

Than all you have to do is create it in static of some class which is created in main thread:

static {
  invokeLaterProcessor=new InvokeLaterProcessor("MyInvokeLater");
  invokeLaterProcessor.start();
}

并通过此代码处理可运行对象:

and process runnables by this code:

invokeLaterProcessor.invokeLater(runnable);

您不需要专有

sun.awt.SunToolkit.invokeLaterOnAppContext(evtContext, rn)

这篇关于来自 Java 7 Update 25 的 rmi 线程的 AppContext 为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆