| // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | package lambdas_jstyle_runnable; | 
 |  | 
 | import java.util.ArrayList; | 
 | import java.util.Iterator; | 
 | import java.util.List; | 
 | import java.util.concurrent.Executors; | 
 | import java.util.concurrent.Future; | 
 | import java.util.concurrent.ThreadPoolExecutor; | 
 | import java.util.concurrent.TimeUnit; | 
 |  | 
 | public class RunnableRunner { | 
 |  | 
 |   private ThreadPoolExecutor executor; | 
 |   private List<Future> futures; | 
 |  | 
 |   RunnableRunner() { | 
 |     executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); | 
 |     futures = new ArrayList<Future>(); | 
 |   } | 
 |  | 
 |   void submit(Runnable runnable) { | 
 |     futures.add(executor.submit(runnable)); | 
 |   } | 
 |  | 
 |   int size() { | 
 |     return executor.getActiveCount(); | 
 |   } | 
 |  | 
 |   void waitFutures() { | 
 |     Iterator<Future> it = futures.iterator(); | 
 |     try { | 
 |       while (it.hasNext()) { | 
 |         it.next().get(1, TimeUnit.MILLISECONDS); | 
 |       } | 
 |     } catch (Exception e) { | 
 |       // Ignore for testing. | 
 |     } finally { | 
 |       while (it.hasNext()) { | 
 |         try { | 
 |           it.next().get(); | 
 |         } catch (Throwable t) { | 
 |           // Ignore too. | 
 |         } | 
 |       } | 
 |       executor.shutdownNow(); | 
 |     } | 
 |   } | 
 | } |