1

我一直在四处寻找一段时间,检查池、执行器和期货的一些实现,但它们都不符合我的目的......或者至少我无法正确实现它。

我有一个类库,都类似于:

class X implements Runnable {
   @Override 
   public void run() { 
    // do sth
   }
} 

我无法修改它们。

我的班级:

class Controller {
   private int threadState;

   void threadStart() {
     // run a thread (made from any of the classes above)
     // and when it exits change the threadState value to V
   }
}

我只需要在 threadStart() 中运行一个线程,它会在退出后执行一些操作,但 threadStart() 函数应该立即通过。

你有什么好主意可以用 Java 或/和 Groovy 解决这个问题吗?谢谢。

4

3 回答 3

1

实现此目的的一种可能(但有些丑陋)的方法是在执行之前将您的任务包装在另一个可运行文件中。包装器将负责委派给实际任务,并在完成后调用回调方法:

void changeThreadState() {
    // This is your call back, in controller
}

void threadStart() {
    final X task = new X(); // task creation (variable has to be final)

    final Thread t = new Thread(new Runnable() {

        @Override
        public void run() {
            task.run();
            changeThreadState();
        }
    });

    t.start();
}

您当然会添加异常处理和所有类似的好东西。

请注意,与直接在您的threadStart方法中创建线程相反,您还可以使用 Executor 或任何其他类型的线程池构造。

于 2013-03-23T10:53:01.767 回答
0

您可以在 runnable 中向起始类添加引用,并在 run 方法完成时在父类上调用 changeState 方法

于 2013-03-23T10:36:08.927 回答
0

您可以从 Groovyas运算符中受益,以将闭包强制为Runnable对象。此外,枚举对于状态来说很酷:

class X implements Runnable {
    void run() {
        sleep 1000
        println "async task done"
    }
}

enum State { NOT_STARTED, DONE }

class Controller {
        State state = State.NOT_STARTED
        Thread t
        void threadStart() {
            t = Thread.start { new X().run(); changeState() } as Runnable
        }

        void changeState() { state = State.DONE }
}

controller = new Controller()
controller.threadStart()

assert controller.state == State.NOT_STARTED
controller.t.join()
assert controller.state == State.DONE
于 2013-03-23T11:49:17.943 回答