Java: set timeout on a certain block of code?

前端 未结 11 1003
终归单人心
终归单人心 2020-11-27 03:45

Is it possible to force Java to throw an Exception after some block of code runs longer than acceptable?

11条回答
  •  孤城傲影
    2020-11-27 04:06

    I created a very simple solution without using any frameworks or APIs. This looks more elegant and understandable. The class is called TimeoutBlock.

    public class TimeoutBlock {
    
     private final long timeoutMilliSeconds;
        private long timeoutInteval=100;
    
        public TimeoutBlock(long timeoutMilliSeconds){
            this.timeoutMilliSeconds=timeoutMilliSeconds;
        }
    
        public void addBlock(Runnable runnable) throws Throwable{
            long collectIntervals=0;
            Thread timeoutWorker=new Thread(runnable);
            timeoutWorker.start();
            do{ 
                if(collectIntervals>=this.timeoutMilliSeconds){
                    timeoutWorker.stop();
                    throw new Exception("<<<<<<<<<<****>>>>>>>>>>> Timeout Block Execution Time Exceeded In "+timeoutMilliSeconds+" Milli Seconds. Thread Block Terminated.");
                }
                collectIntervals+=timeoutInteval;           
                Thread.sleep(timeoutInteval);
    
            }while(timeoutWorker.isAlive());
            System.out.println("<<<<<<<<<<####>>>>>>>>>>> Timeout Block Executed Within "+collectIntervals+" Milli Seconds.");
        }
    
        /**
         * @return the timeoutInteval
         */
        public long getTimeoutInteval() {
            return timeoutInteval;
        }
    
        /**
         * @param timeoutInteval the timeoutInteval to set
         */
        public void setTimeoutInteval(long timeoutInteval) {
            this.timeoutInteval = timeoutInteval;
        }
    }
    

    example :

    try {
            TimeoutBlock timeoutBlock = new TimeoutBlock(10 * 60 * 1000);//set timeout in milliseconds
            Runnable block=new Runnable() {
    
                @Override
                public void run() {
                    //TO DO write block of code to execute
                }
            };
    
            timeoutBlock.addBlock(block);// execute the runnable block 
    
        } catch (Throwable e) {
            //catch the exception here . Which is block didn't execute within the time limit
        }
    

    This was so much useful for me when i had to connect to a FTP account. Then download and upload stuff. sometimes FTP connection hangs or totally breaks. This caused whole system to go down. and i needed a way to detect it and prevent it from happening . So i created this and used it. Works pretty well.

提交回复
热议问题