Merge pull request #9996 from sahilsingla112/feature/BAEL-4558-stopexecution
BAEL-4558: Article for stopping execution after a certain time
This commit is contained in:
		
						commit
						e459c3faa0
					
				| @ -0,0 +1,263 @@ | ||||
| package com.baeldung.concurrent.stopexecution; | ||||
| 
 | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.io.Reader; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Timer; | ||||
| import java.util.TimerTask; | ||||
| import java.util.concurrent.ExecutorService; | ||||
| import java.util.concurrent.Executors; | ||||
| import java.util.concurrent.Future; | ||||
| import java.util.concurrent.ScheduledExecutorService; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.concurrent.TimeoutException; | ||||
| 
 | ||||
| public class StopExecution { | ||||
|     private static final Logger LOG = LoggerFactory.getLogger(StopExecution.class); | ||||
| 
 | ||||
|     public static void main(String[] args) { | ||||
|         StopExecution stopExecution = new StopExecution(); | ||||
|         //stopExecution.testUsingLoop(); | ||||
|         //stopExecution.testTimer(); | ||||
|         stopExecution.testScheduledExecutor(); | ||||
|         LOG.info("done"); | ||||
|     } | ||||
| 
 | ||||
|     public void testUsingLoop() { | ||||
|         long start = System.currentTimeMillis(); | ||||
|         long end = start + 5000; | ||||
|         List<String> items = new ArrayList<>(); | ||||
|         int counter = 0; | ||||
| 
 | ||||
|         // Let this loop run only upto 5 seconds | ||||
|         while (System.currentTimeMillis() < end && counter < items.size()) { | ||||
|             // Fetch the item from the list. | ||||
|             // Some expensive operation on the item. | ||||
|             try { | ||||
|                 Thread.sleep(100); | ||||
|             } catch (InterruptedException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|             counter++; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static void testThreads() { | ||||
|         Thread thread = new Thread(new Runnable() { | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 LOG.info("inside run"); | ||||
| 
 | ||||
|                 try { | ||||
|                     Thread.sleep(10000); | ||||
|                 } catch (InterruptedException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|                 LOG.info("exit run"); | ||||
|             } | ||||
|         }); | ||||
|         thread.start(); | ||||
|         while (thread.getState() != Thread.State.TERMINATED) { | ||||
|             LOG.info(thread.getState().name()); | ||||
|             try { | ||||
|                 Thread.sleep(500); | ||||
|             } catch (InterruptedException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static void testExecutor() { | ||||
|         final ExecutorService service = Executors.newSingleThreadExecutor(); | ||||
|         Future<String> f = null; | ||||
|         try { | ||||
|             f = service.submit(() -> { | ||||
|                 // Do you long running calculation here | ||||
|                 try { | ||||
|                     Thread.sleep(2737); // Simulate some delay | ||||
|                 } catch (InterruptedException e) { | ||||
|                     LOG.info("Interrupted"); | ||||
|                     return "interrupted"; | ||||
|                 } | ||||
|                 LOG.info("Sleep finished"); | ||||
|                 return "42"; | ||||
|             }); | ||||
| 
 | ||||
|             LOG.info(f.get(2, TimeUnit.SECONDS)); | ||||
|         } catch (TimeoutException e) { | ||||
|             f.cancel(true); | ||||
|             LOG.error("Calculation took to long"); | ||||
|         } catch (Exception e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } finally { | ||||
|             service.shutdown(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void testExecutor2() { | ||||
|         final ExecutorService service = Executors.newSingleThreadExecutor(); | ||||
|         Future f = null; | ||||
|         try { | ||||
|             f = service.submit(new LongRunningTask()); | ||||
|             LOG.info("testExecutor2"); | ||||
|             f.get(1, TimeUnit.SECONDS); | ||||
|         } catch (final TimeoutException e) { | ||||
|             f.cancel(true); | ||||
|             LOG.error("Calculation took to long"); | ||||
|         } catch (final Exception e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } finally { | ||||
|             service.shutdownNow(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void testScheduledExecutor() { | ||||
|         LOG.info("testScheduledExecutor"); | ||||
|         ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); | ||||
|         Future future = executor.submit(new LongRunningTask()); | ||||
|         executor.schedule(new Runnable() { | ||||
|             public void run() { | ||||
|                 future.cancel(true); | ||||
|             } | ||||
|         }, 1000, TimeUnit.MILLISECONDS); | ||||
|         executor.shutdown(); | ||||
|     } | ||||
| 
 | ||||
|     public void testThreadAndInterrupt() { | ||||
| 
 | ||||
|         Thread t; | ||||
|         try { | ||||
|             t = new Thread(new LongRunningTask()); | ||||
| 
 | ||||
|             LOG.info("testExecutor3"); | ||||
|             long end = System.currentTimeMillis() + 2000; | ||||
|             t.start(); | ||||
|             while (t.isAlive() && System.currentTimeMillis() < end) { | ||||
|                 Thread.sleep(50); | ||||
|             } | ||||
|             t.interrupt(); | ||||
|         } catch (final Exception e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void testTimer() { | ||||
|         LOG.info("Timer test"); | ||||
|         Thread t = new Thread(new LongRunningTask()); | ||||
|         Timer timeoutTimer = new Timer(); | ||||
|         timeoutTimer.schedule(new TimeOutTask(t, timeoutTimer), 1000); | ||||
|         t.start(); | ||||
|     } | ||||
| 
 | ||||
|     class MyRunnableTask implements Runnable { | ||||
|         public void run() { | ||||
|             try { | ||||
|                 LOG.info("MyRunnable..."); | ||||
|                 Thread.sleep(10000); | ||||
|             } catch (InterruptedException ie) { | ||||
|                 LOG.info("MyRunnable interrupted..."); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     class TimeOutTask extends TimerTask { | ||||
|         private Thread t; | ||||
|         private Timer timer; | ||||
| 
 | ||||
|         TimeOutTask(Thread t, Timer timer) { | ||||
|             this.t = t; | ||||
|             this.timer = timer; | ||||
|         } | ||||
| 
 | ||||
|         public void run() { | ||||
|             if (t != null && t.isAlive()) { | ||||
|                 t.interrupt(); | ||||
|                 timer.cancel(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     class LongRunningTask implements Runnable { | ||||
|         @Override | ||||
|         public void run() { | ||||
|             longRunningSort(); | ||||
|         } | ||||
| 
 | ||||
|         private void longRunningOperation() { | ||||
|             LOG.info("long Running operation started"); | ||||
| 
 | ||||
|             try { | ||||
|                 //Thread.sleep(500); | ||||
|                 longFileRead(); | ||||
|                 LOG.info("long running operation finished"); | ||||
|             } catch (InterruptedException e) { | ||||
|                 LOG.info("long Running operation interrupted"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void longRunningSort() { | ||||
|             LOG.info("long Running task started"); | ||||
|             // Do you long running calculation here | ||||
|             int len = 100000; | ||||
|             List<Integer> numbers = new ArrayList<>(); | ||||
|             try { | ||||
|                 for (int i = len; i > 0; i--) { | ||||
|                     //Thread.sleep(5) | ||||
|                     numbers.add(i); | ||||
|                 } | ||||
| 
 | ||||
|                 int i = 0; | ||||
|                 for (i = 0; i < len; i++) { | ||||
|                     int minIndex = i; | ||||
|                     for (int j = i + 1; j < len; j++) { | ||||
|                         if (numbers.get(minIndex) > numbers.get(j)) | ||||
|                             minIndex = j; | ||||
|                     } | ||||
|                     if (minIndex != i) { | ||||
|                         int temp = numbers.get(i); | ||||
|                         numbers.set(i, numbers.get(minIndex)); | ||||
|                         numbers.set(minIndex, temp); | ||||
|                     } | ||||
|                     throwExceptionOnThreadInterrupt(); | ||||
|                 } | ||||
|                 LOG.info("Index position: " + i); | ||||
|                 LOG.info("Long running task finished"); | ||||
|             } catch (InterruptedException e) { | ||||
|                 LOG.info("long Running operation interrupted"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void longFileRead() throws InterruptedException { | ||||
|             String file = "input.txt"; | ||||
|             ClassLoader classloader = getClass().getClassLoader(); | ||||
| 
 | ||||
|             try (InputStream inputStream = classloader.getResourceAsStream(file)) { | ||||
|                 Reader inputStreamReader = new InputStreamReader(inputStream); | ||||
| 
 | ||||
|                 int data = inputStreamReader.read(); | ||||
|                 while (data != -1) { | ||||
|                     char theChar = (char) data; | ||||
|                     data = inputStreamReader.read(); | ||||
|                     throwExceptionOnThreadInterrupt(); | ||||
|                 } | ||||
|             } catch (IOException e) { | ||||
|                 LOG.error("Exception: ", e); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void throwExceptionOnThreadInterrupt() throws InterruptedException { | ||||
|             if (Thread.currentThread().interrupted()) { | ||||
|                 throw new InterruptedException(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user