Java Eclipse插件和线程

Java Eclipse插件和线程,java,multithreading,eclipse-plugin,Java,Multithreading,Eclipse Plugin,我有一个问题,不知道在哪里可以找到正确的答案。 下一个假设问题是: 有两个无关的eclipse插件A和B。 A和B由2名独立开发人员开发。 让插件调用一些内部eclipse代码。 有没有可能我们在B中使用相同的线程得到某个函数。 i、 e.堆栈跟踪将如下所示: B:类别Z:f2; ... 日食:经典:f1; ... A:classX:f0 如果这是可能的,请举例说明 i、 有没有可能 A:classX:f0中的Thread.currentThread;与 Thread.currentThread

我有一个问题,不知道在哪里可以找到正确的答案。 下一个假设问题是: 有两个无关的eclipse插件A和B。 A和B由2名独立开发人员开发。 让插件调用一些内部eclipse代码。 有没有可能我们在B中使用相同的线程得到某个函数。 i、 e.堆栈跟踪将如下所示:

B:类别Z:f2; ... 日食:经典:f1; ... A:classX:f0

如果这是可能的,请举例说明

i、 有没有可能 A:classX:f0中的Thread.currentThread;与
Thread.currentThread在B:classZ:f2

我不明白为什么不。假设B提供了一个通用工作集视图,a提供了一个新的具体类型的IResource。B呈现视图的代码可以调用Eclipse的工作集框架来获取IResource名称,这将调用A的IResource.getName实现

我不记得在一个线程中有任何插件的显式沙盒,尽管我已经很久没有做任何插件开发了。我的假设是,如果一个插件不能动态链接到另一个插件的代码,那么扩展点的概念几乎不可能实现


现在很明显,如果A和B完全独立开发,您可能无法拥有静态链接,但我们不是在讨论这个问题。

如果您只是希望将调用链接在一起,那么它们将始终在同一线程中运行,除非一段代码生成自己的线程:即,如果您说

A:foo.doSomething();
B:bar.doSomethingElse();
这两个调用将始终在同一个线程中运行,或者至少启动它们的线程,但是它们可能会生成自己的线程

但是,不可能让代码指定它希望在哪个线程中运行,即在不同的执行路径中运行,这些路径不在同一线程中:

A:foo.doSomething(commonThread);
在另一个线程中,commonThread是一个共享线程对象

B:bar.doSomethingElse(commonThread);
您需要做的是让您希望代码运行的线程能够接受您希望在该线程中运行的任务。这就是像SwingUtilities.invokeXXXRunnable r这样的东西如何在EDT上运行的。这是一个大致的示例,说明这可能是一个简单的示例,并不完全正确/可靠

class WorkerThread implements Runnable{

  BlockingDeque<Runnable> tasks = ...;

  Thread t;

  public void startWorker(){
    if(t != null && t.isAlive())return;
    t = new Thread(this);
    t.start();
  }

  public void run(){
    while(true){
       Runnable nextTask = tasks.getFirst();
       nextTask.run();
    }
  }

  public void doTaskInThread(Runnable r){
    if(Thread.currentThread() == this.t){
       //already in the worker thread, do immediately
       r.run();
    }else{
       //not in the worker thread so queue
       //alternatively eliminate the first test condition and always queue
       tasks.push(r);
    }
  }
}

虽然可以在代码中设计类似于上述内容的内容,但这可能非常困难,特别是如果您无法访问您希望控制的所有插件的源代码。

+1表示有一个好的答案,而-1表示与问题完全无关。并不是说我怪你,原来的问题很难理解。看起来你正确理解了这个问题。我想对你的答案投赞成票,但没有正确的声誉将在内部调用某些eclipse函数b:classZ:f2;//如果B:classZ:f2,我们将-进入函数-作为结果;将修改-例如:Thread.currentThread.setContextClassLoaderXXX;并且在返回之前不恢复它的原始值-我们将在A:classX:f0中得到错误的上下文类装入器@vitali_y:是的,我想你是对的,如果一个线程设置了上下文类加载器,但没有还原它,那么它将保留给在同一线程上运行代码的其他插件。至于向上投票,你需要有15个代表才能向上投票。但是,作为提问者,如果答案正确地回答了您的问题,您可以接受答案,并使用每个答案旁边的复选标记。