2010-06-17 3 views
1

У меня вопрос и не знаю, где найти правильный ответ. Гипотетическая проблема следующая: есть 2 несвязанных плагина Eclipse A и B. A и B были разработаны 2 независимыми разработчиками. Позвольте плагину A вызвать некоторый внутренний код затмения. Возможно ли, что мы получим некоторую функцию в B с тем же потоком. т. Е. Трассировка стека будет выглядеть так:Eclipse plungins and threads

B: classZ: f2(); ... eclipse: classY: f1(); ... A: classX: f0();

может ваш пожалуйста указать пример, если это возможно ...

т.е. возможно или нет Thread.currentThread() в "A: classX: f0();" то же самое, что и Thread.currentThread() в "B: classZ: f2();"?

ответ

0

Я не понимаю, почему нет. Скажем, B предоставил общий рабочий набор, и A вносит новый конкретный тип IResource. B для визуализации представления может вызвать рабочую структуру Eclipse для получения имен IResource, которые будут вызывать реализацию A IResource.getName().

Я не помню, что в потоке есть явная песочница плагинов, хотя прошло очень много времени с тех пор, как я сделал какую-либо разработку плагина. Мое предположение заключается в том, что концепции точек расширения практически невозможно реализовать, если один плагин не может динамически ссылаться на другой код плагина.

Теперь, очевидно, что если A и B разработаны полностью независимо, у вас может не оказаться статической связи , но мы не об этом говорим.

+0

похоже, что вы правильно поняли вопрос.Я хочу проголосовать за ваш ответ, но не имею правильной репутации. –

+0

A: classX: f0(); // вызовет некоторую функцию eclipse внутри –

+0

B: classZ: f2(); // мы будем - входим в функцию - как результат –

0

Если вы просто хотите, чтобы цепь вызовов вместе, то они всегда будут работать в том же потоке, если один кусок кода не порождает свои собственные темы: то есть, если вы говорите

A:foo.doSomething(); 
B:bar.doSomethingElse(); 

оба вызовы всегда будут работать в тот же поток (или, по крайней мере, начать их, однако они могут порождать собственные потоки).

Это, однако, не представляется возможным, чтобы иметь код указать, какие темы он желает работать в ИЭ в раздельных путей выполнения, не встречающихся в той же теме:

A:foo.doSomething(commonThread); 

и в другом потоке, где «commonThread "является общим объектом Thread.

B:bar.doSomethingElse(commonThread); 

То, что вы должны сделать, это иметь тему, где вы хотите запускать код Execute быть в состоянии принять задачи, которые вы хотите работать в этом потоке. Вот как работают вещи, такие как SwingUtilities.invokeXXX (Runnable 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); 
    } 
    } 
} 

Хотя это может быть возможно спроектировать что-то вроде выше в коде, вероятно, будет очень сложно, особенно если у вас нет доступа к источнику для всех плагинов, которые вы хотите контролировать.

+0

+1 за хороший ответ, но -1 за то, что он не имеет абсолютно никакого отношения к вопросу. Не то чтобы я обвинял вас, оригинальный вопрос был трудно понять. –