使用Java 7 Update 25的rmi线程中的AppContext为null [英] AppContext is null from rmi thread with Java 7 Update 25

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

问题描述

我们最近从Update 21更新到Java 7 Update 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.



的sun.awt.SunToolkit.getSystemEventQueueImplPP(未知来源)
sun.awt.SunToolkit.getSystemEventQueueImplPP的java.lang.NullPointerException(来自

sun.awt.SunToolkit.getSystemEventQueueImpl(未知来源)的未知来源
java.awt.Toolkit.getEventQueue(未知来源)java.awt.EventQueue.isDispatchThread(未知来源) )
javax.swing.SwingUtilities.isEventDispatchThread(未知来源)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.Met hod.invoke(未知来源)at
sun.rmi.server.UnicastServerRef.dispatch(未知来源)
sun.rmi.transport.Transport $ 1.run(未知来源)at
sun .rmi.transport.Transport $ 1.run(未知来源)at
java.security.AccessController.doPrivileged(Native Method)at
sun.rmi.transport.Transport.serviceCall(Unknown Source)at $ b在
sun的
sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(未知
来源)$ b sun.rmi.transport.tcp.TCPTransport.handleMessages(未知来源)。
sun。 rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(Unknown
Source)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown
Source)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(来自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)

此错误仅出现在网站上,当我们通过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

推荐答案

我遇到了与Java Web Start一样运行的Java3D的问题。我找到了另一个解决方案。您必须使用runnables队列准备自己的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();
}

并按此代码处理runnables:

and process runnables by this code:

invokeLaterProcessor.invokeLater(runnable);

您不需要专有

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

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

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