2017-08-10 67 views
-2

我想爲報警應用程序創建多個Runnable對象,它將在用戶指定的時間內執行任務。Java - 實例化Runnable Inside Loop

我嘗試做內環路這樣的:

ScheduledExecutorService wait; 
List<Runnable> listens = new ArrayList<>(); 
int i; 
private void playAlarmOnInit(){ 
wait = Executors.newScheduledThreadPool(3); 
    // loop through the tasks to get times    
    int counts = getDays().size();   
    for(i = 0; i < counts; i++){ 
     if(!getDays().get(i).isEmpty()) { 
     Runnable listen = new Runnable() { 
      @Override 
      public void run() { 
       if(!getDays().get(i).equals("Everyday")) { 
        System.out.println(getDays().get(i) + " " + getTimes().get(i));           
       } else { 
        DateFormat format = new SimpleDateFormat("d-M-yyyy"); 
        Date date = new Date(); 
        String time = format.format(date); 
        System.out.println(time + " " + getTimes().get(i)); 
       } 
//    System.out.println(" " + getTimes().get(i)); 
        } 
      }; 
      wait.scheduleAtFixedRate(listen, 0, 1, TimeUnit.SECONDS); 
     } 
    } 
} 

它什麼都不做。 爲什麼上面的代碼不起作用?

+0

你是什麼意思「它什麼都不做」?例外?沒有一個'Runnable'正在執行? – JohnnyAW

+0

沒什麼。甚至沒有執行任何懷疑或Runnable。 – KeepMove

+0

你確定'getDays()'實際上是返回一些東西,像@John Tribe在他的答案中提到的? – JohnnyAW

回答

2

您的問題可能是您在Runnable中使用了i。在執行Runnable時,i的值應該等於counts,所以getDays().get(i)Runnuble中實際上應該會拋出IndexOutOfBoundException。嘗試使用try-catch並檢查是否有異常。爲了解決這個問題,你應該創建一個新的最終的變量和Runnable使用它:

if(!getDays().get(i).isEmpty()) { 
    final int runnableI = i; 
    Runnable listen = new Runnable() { 
     @Override 
     public void run() { 
      if(!getDays().get(runnableI).equals("Everyday")) { 
      .... 

或者你甚至可以在白天儲存作爲最終變量:

final String day = getDays().get(i); 

,並在Runnable

使用
+0

不,這不是問題。如果我把'for loop'放在'Runnable'裏面,那麼它正常執行。 – KeepMove

+1

@KeepMove好吧,它會的。我不認爲你明白這個答案。如果for循環圍繞runnable的創建並引用循環變量,那麼在執行runnables時,'i'將等於'getDays()。size()',你會得到一個'ArrayIndexOutOfBoundsException'(你不會看到,因爲它正在被執行程序吞下)。 –

+0

@James_D – JohnnyAW

-1

也許主程序在線程啓動之前關閉。添加Thread.sleep(5000),之後:

wait.scheduleAtFixedRate(listen, 0, 1, TimeUnit.SECONDS); 
Thread.spleep(5000) 

或者您的列表(getDays)爲空。

+0

爲什麼要投票? –