通过URLClassLoader加载的Java插件在运行后不返回

时间:2014-02-20 21:12:28

标签: java multithreading plugins

BLUF :当我运行我的一个自定义插件时,在插件完成之前,执行不会返回到父级。

背景: 我有一个父/插件设置,每个插件实现一个基本的接口

public interface PluginInterface {
    public int load(String configFile);
    public boolean run();
    public boolean stop();
    public boolean unload(boolean now);
}

我使用URLClassLoader.newInstance()从父应用加载插件。加载后,我调用插件接口函数load()并传递配置文件。到目前为止一切都很好。

在插件内部,run()实现为

@Override
public boolean run() {

    if (_pbs == null)
        return false;

    //ThreadStart just implements Runnable and does the actual work
    _ts = new ThreadStart(_pbs);
    _ts.run();

    return true;
}

本质上,我创建一个新线程来执行实际执行,以便run()可以返回到父级,并且可以继续执行。但这不会发生。在从插件完成其工作之后,才会从父节点调用run()后执行。所以我的问题是,我做错了什么,为什么父母一直挂起,直到插件完成?它们不是短暂的任务,所以我希望插件线程会在某个时刻暂停并发生上下文切换。

1 个答案:

答案 0 :(得分:1)

您可能需要_ts.start();new Thread(_ts).start();