我想了解爲什麼Runnable.run
方法是作爲輸入並沒有返回任何輸出?爲什麼使用Runnable.run()方法返回沒有輸出
我知道線程的局部變量(引用或原語)必須來自自己的堆棧,但系統可能已經被初始化。換句話說,我不認爲這在技術上是不可能的(但我可能是錯的)。
我想了解爲什麼Runnable.run
方法是作爲輸入並沒有返回任何輸出?爲什麼使用Runnable.run()方法返回沒有輸出
我知道線程的局部變量(引用或原語)必須來自自己的堆棧,但系統可能已經被初始化。換句話說,我不認爲這在技術上是不可能的(但我可能是錯的)。
A Runnable
意思就是這樣,你可能要找的是一個Callable
,而不是通過它的call()
方法返回一個值。並且不能將參數傳遞給Runnable
:它僅取決於您的接口實現。 Callable
也一樣。
Java有很多工具可以使Callable
異步運行:請參見ExecutorService
。並閱讀this一個完整的圖片。
返回值是有用的,並且Callable支持返回一個對象。
Future<MyReturnType> ret = executor.submit(new Callable<MyReturnType>() {
public MyReturnType call() throws Exception {
// do something
return new MyReturnType(value1, value2 ...);
}
});
正如你所看到的,因爲ExecutorService的支持持傳遞值回線與未來目標可贖回可以返回一個值。這只是在Java 5.0中添加的,因此在此之前Runnable
返回一個值將不會有用,因爲沒有返回值的位置。
Runnable接口不需要帶任何參數,因爲它是一個對象,它可以容納任意數量的字段。例如
static void bgLog(final Level level, final String message, final Throwable t) {
logExec.submit(new Runnable() {
// the anonymous nested class implicitly holds a copy of the final arguments above.
public void run() {
LOG.log(level, message, t);
}
});
}
正如可以看到,在run()方法可以使用任何數量的值,其通過如下事實implcitly傳遞的可運行是一個對象,不只是一種方法的保持器。
Runnable
的合同使其成爲構建高級抽象的完美原料。這是分離關注點原理的一個很好的例子。
Runnable
的主要設計目標是代表執行新線程的切入點。它不代表一個函數甚至一個計算:只是在另一個線程上運行的代碼。考慮到這一點,void run()
方法簽名非常有意義。如果它接受了參數,那隻會加重許多用例,其中不要想要傳入參數。
void返回值的例子更加清晰:一旦線程啓動,它就沒有人可以報告,所以返回值的概念只是一個粘性。
你更喜歡什麼?
實際上,實現Runnable
的類可以使用構造函數進行初始化,這使得您可以完全自由地執行任何操作。初始化。至於沒有返回任何東西,總是有接口,允許返回值。
也許你應該考慮這些空隙和非空方法的接口等效:-)
乾杯,
你是什麼意思「可能已經做出初始化」?目前還不清楚你實際提出的是什麼。 –
出於好奇:在你看來,它應該有什麼參數/返回值? – ppeterka