3

我有一個實現了可調用接口的類。我想使用ScheduledExecutorService接口的scheduleAtFixedRate方法爲該類安排任務。然而,scheduleAtFixedRate需要一個可運行的對象作爲它可以調度的命令。我們如何將可調用對象轉換爲可運行對象

因此,我需要一些方法可以將可調用對象轉換爲可運行對象。我嘗試了簡單的鑄造,但那不起作用。

示例代碼:

package org.study.threading.executorDemo; 

import java.util.concurrent.Callable; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

class ScheduledExecutionTest implements Callable<String> { 

    @Override 
    public String call() throws Exception { 
     // TODO Auto-generated method stub 
     System.out.println("inside the call method"); 
     return null; 
    } 

} 
public class ScheduledExecution { 
    public static void main(String[] args) { 
     ScheduledExecutorService sec = Executors.newScheduledThreadPool(10); 
     sec.scheduleAtFixedRate(new ScheduledExecutionTest(), 5, 2, TimeUnit.SECONDS); 
    } 
} 
+0

'實現Callable,Runnable'不行嗎?我從來沒有嘗試過使用兩種。 – Zircon

+0

Callable的目的是返回一個值。爲什麼你會返回一個你想放棄的價值固定的價格? –

+2

把@ PeterLawrey的評論換個角度來看,你想用'Callable'返回的值做什麼? – dcsohl

回答

6
FutureTask task1 = new FutureTask(Callable<V> callable) 

現在這個任務1是可運行的,因爲:

  1. class FutureTask<V> implements RunnableFuture<V>
  2. RunnableFuture<V> extends Runnable, Future<V>
從上面兩個關係

所以,TASK1可運行,並可以在裏面使用Executor.execute(Runnable)方法

+0

雖然FutureTask是從Callable獲取Runnable的一種便捷方式,但請注意,JavaDoc for FutureTask指定計算一旦完成就無法重新啓動,這意味着它只能運行一次。假設問題是提供一個Runnable到scheduleAtFixedRate,它試圖多次運行,FutureTask並不適合這個目的,儘管在其他情況下只需要一次執行就可以使用。 JavaDoc鏈接: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/FutureTask.html – njr

0

爲什麼不使用這樣的:

final Callable<YourType> callable = ...; // Initialize Callable 

    Runnable callableAsRunnable =() -> { 
    try { 
     callable.call(); 
    } catch (Exception e) { 
     // Handle the exception locally or throw a RuntimeException 
    } 
    }; 
1

假設你並不真的需要Callable返回有用的東西,你可以用一個Callable作爲一個Runnable

Runnable run = new Runnable() { 
    public void run() { 
     try { 
      Object o = callable.call(); 
      System.out.println("Returned " + o); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}; 

or in Java 8

Runnable run =() -> { 
    try { 
     Object o = callable.call(); 
     System.out.println("Returned " + o); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
}; 

這很麻煩,但它聽起來像Callable本來應該是一個Runnable,你不必這樣做。

相關問題