【发布时间】:2012-02-07 07:15:52
【问题描述】:
我一直在使用 Java 线程,以便为在管道中运行进程提供 GUI 平台。我已经设法解决了SwingWorker 的一些问题,但这一个似乎难以理解。
我的SwingWorker 看起来像:
SwingWorker<Boolean,Object> worker = new SwingWorker<Boolean,Object>() {
@Override
public Boolean doInBackground() {
return launchBlockingPipelineProcess(process, instance, project, logger, state);
}
@Override
protected void done(){
boolean success = false;
try{
success = get();
if (!success){
state.setTaskFailed(true);
}
if (process.getStatus().equals(Status.Interrupted)){
state.setTaskInterrupted(true);
}
}catch (Exception ex){
state.setTaskFailed(true);
}
processCompleted(process, success, state);
}
};
我用它来运行一个Java进程;启动代码的简化版本是:
try{
Class<?> target_class = Class.forName(main_class);
CommandInstance instance = (CommandInstance)target_class.newInstance();
CommandFunctions.ProcessState state = instance.execute(args);
}catch (InvocationTargetException e){
throw new PipelineException("Java process '" + this.getName() + "." + uid + "' encountered exception: " + e.getCause().getMessage());
}catch (Exception e){
throw new PipelineException("JavaProcess encountered exception invoking target: " + e.getMessage());
}
进程本身在代码周围有一个 try-catch 块,可以从文件中加载一些数据。然而,尽管被包裹在两层 try-catch 块中(实际上是三层,如果你计算 done() 方法),当加载器抛出异常时,它会打印堆栈跟踪,异常没有被捕获,SwingWorker线程挂起(代码停止,因此我无法再强制中断)。
这种异常挂起在其他情况下也发生过;最令人费解的是,在其他看似相同的情况下,异常被捕获并且线程优雅地退出。
虽然我会继续搜索,但我无法在网上找到很多关于此的内容。我不是 Swing 线程方面的专家,所以我希望有人可能对这类问题有所了解。我希望这是我的一个非常愚蠢的错误:)
编辑:@Adrian,这是堆栈跟踪。好像中途停顿了……很奇怪:
java.io.EOFException
at java.io.RandomAccessFile.readFully(RandomAccessFile.java:399)
at mgui.io.standard.nifti.Nifti1Dataset.readVolBlob(Nifti1Dataset.java:2179)
at mgui.io.standard.nifti.Nifti1Dataset.readDoubleVol(Nifti1Dataset.java:1916)
at mgui.io.standard.nifti.NiftiVolumeLoader.setGrid3DBlocking(NiftiVolumeLoader.java:186)
at mgui.io.domestic.shapes.VolumeFileLoader.setGrid3D(VolumeFileLoader.java:237)
at mgui.io.domestic.shapes.VolumeFileLoader.getGrid3D(VolumeFileLoader.java:139)
at mgui.io.domestic.shapes.VolumeFileLoader.getGrid3D(VolumeFileLoader.java:97)
at minc.MincFunctions.create_volume_atlas_masks(MincFunctions.java:5240)
at minc.MincFunctions.run_command(MincFunctions.java:153)
at mgui.command.CommandInstance.execute(CommandInstance.java:87)
at mgui.pipelines.JavaProcess.run(JavaProcess.java:141)
at mgui.pipelines.PipelineFunctions.launchBlockingPipelineProcess(PipelineFunctions.java:238)
at mgui.pipelines.PipelineFunctions.launchPipelineProcess(PipelineFunctions.ja
EDIT2:在 Eclipse 中进行调试,我可以在抛出它的行的断点处停止(好吧,前一步);那时的堆栈跟踪是:
Nifti1Dataset.readVolBlob(short) line: 2179
Nifti1Dataset.readDoubleVol(short) line: 1916
NiftiVolumeLoader.setGrid3DBlocking(Grid3D, int, ProgressUpdater) line: 186
NiftiVolumeLoader(VolumeFileLoader).setGrid3D(Grid3D, int, ProgressUpdater) line: 237
NiftiVolumeLoader(VolumeFileLoader).getGrid3D(VolumeInputOptions, int, ProgressUpdater) line: 139
NiftiVolumeLoader(VolumeFileLoader).getGrid3D(int) line: 97
MincFunctions.create_volume_atlas_masks() line: 5278
MincFunctions.run_command(String) line: 153
MincFunctions(CommandInstance).execute(String[]) line: 87
JavaProcess.run(String[], long) line: 141
PipelineFunctions.launchBlockingPipelineProcess(PipelineProcessInstance, String, InterfaceProject, String, PipelineState) line: 238
PipelineFunctions.launchPipelineProcess(PipelineProcessInstance, String, InterfaceProject, String, boolean, PipelineState) line: 78
PipelineFunctions.launchPipelineProcess(PipelineProcessInstance, boolean, PipelineState) line: 52
PipelineProcessInstance.launch(boolean) line: 187
InterfacePipeline.launch(boolean) line: 388
PipelineLauncher.doInBackground() line: 57
PipelineLauncher.doInBackground() line: 1
SwingWorker$1.call() line: 277
FutureTask$Sync.innerRun() line: 303
SwingWorker$2(FutureTask<V>).run() line: 138
PipelineLauncher(SwingWorker<T,V>).run() line: 316
ThreadPoolExecutor$Worker.runTask(Runnable) line: 886
ThreadPoolExecutor$Worker.run() line: 908
Thread.run() line: 662
【问题讨论】:
-
可能是错误而不是异常。你检查过吗?请打印堆栈跟踪。
-
@Adrian 错误的实现只返回
Got exception
标签: java multithreading swing exception-handling swingworker