Я только что решил эту проблему, и моя первая попытка была похожей - массив или список элементов нужного типа. Но через некоторое время я придумал что-то вроде этого:
abstract class MyRunnable<T> implements Runnable{
T result;
}
MyRunnable<Integer> runBlock = new MyRunnable<Integer>(){
MessageBox mb = /* ... */;
/* set up messagebox */
result = mb.open();
}
GUI.display().syncExec(runBlock);
runBlock.result; //holds a result Integer
Это намного аккуратнее и удаляет избыточные переменные.
КСТАТИ. Моя первая попытка была использовать UIThreadRunnable, но я не хотел зависимости SWTBot, поэтому я отбросил это решение. После того, как я сделал свое собственное решение, я обнаружил, что они используют похожую работу там.