java响应超时处理、限时处理的jdk自带方式

工作中遇到了一个问题,需要多文件进行压缩后上传处理,偶尔会有压缩过程占用时间过长问题导致整个流程延长影响用户体验,因此需要对该过程进行限时处理。

网上查询,Executor和ExecutorService可以满足需求。

Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command),该方法接收一个Runable实例,它用来执行一个任务,任务即一个实现了Runnable接口的类,一般来说,Runnable任务开辟在新线程中的使用方法为:new Thread(new RunnableTask())).start(),但在Executor中,可以使用Executor而不用显示地创建线程:executor.execute(new RunnableTask()); // 异步执行

ExecutorService:是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,返回 Future 对象,以及可跟踪一个或多个异步任务执行状况返回Future的方法;可以调用ExecutorService的shutdown()方法来平滑地关闭 ExecutorService,调用该方法后,将导致ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关闭ExecutorService。因此我们一般用该接口来实现和管理多线程。

通过 ExecutorService.submit() 方法返回的 Future 对象,可以调用isDone()方法查询Future是否已经完成。当任务完成时,它具有一个结果,你可以调用get()方法来获取该结果。你也可以不用isDone()进行检查就直接调用get()获取结果,在这种情况下,get()将阻塞,直至结果准备就绪,还可以取消任务的执行。Future 提供了 cancel() 方法用来取消执行 pending 中的任务。ExecutorService 部分代码如下:

public interface ExecutorService extends Executor {
    void shutdown();
     Future submit(Callable task);
     Future submit(Runnable task, T result);
     List> invokeAll(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException;
}

这个链接介绍比较清楚:https://blog.csdn.net/weixin_40304387/article/details/80508236

另外附上代码:

public static boolean wavTomp3(String inPath,String outFile){
	    	boolean status=false;
	        final ExecutorService exec = Executors.newFixedThreadPool(1);
	        Callable call = new Callable() {
	            public Boolean call() throws Exception {
			        File file=new File(inPath);
			        try {
			            execute(file,outFile);//处理过程,正常处理大约1秒,有时会卡住
			            return true;
			        } catch (Exception e) {
			            e.printStackTrace();
			            WriteLog.wLog("wavTomp3-Callable Exception:"+inPath+" err:"+e.toString());
			        	return false;
			        }
	            }
	        };

        try {
            Future future = exec.submit(call);
            status = future.get(800 *1, TimeUnit.MILLISECONDS); // 任务处理超时时间,0.8秒以内可正常结束,否则直接上传原始文件
            System.out.println("wavTomp3-ret:" + status+" "+inPath);
        } catch (TimeoutException ex) {
            System.out.println("wavTomp3-Timeout"+" "+inPath);
            ex.printStackTrace();
            WriteLog.wLog("wavTomp3-处理超时:"+inPath+" err:"+ex.toString());
            return false;
        } catch (Exception e) {
            System.out.println("wavTomp3-Exception");
            e.printStackTrace();
            WriteLog.wLog("wavTomp3-处理失败:"+inPath+" err:"+e.toString());
            return false;
        }
        // 关闭线程池
        exec.shutdown();
	    return status;
	    }

 

你可能感兴趣的:(java,线程)