创建线程已经返回后,如何在Java线程上超时?

时间:2019-01-23 17:50:09

标签: java multithreading timeout

我正在尝试编写一个创建线程的方法,该方法在该方法返回后才起作用。我需要该线程在一定时间后超时。

我有一个可行的解决方案,但是我不确定这是否是最好的方法。

  new Thread(() -> {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<Void> future = executor.submit(new Callable() {
            public Void call() throws Exception {
              workThatTakesALongTime();
        });
        try {
            future.get(timeoutMillis, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            LOGGER.error("Exception from timeout.", e);
        }
    }).start();

有没有在线程内不使用ExecutorService的更好方法?

2 个答案:

答案 0 :(得分:0)

有多种方法可以实现此目的。 一种方法是像您一样使用ExecutorService。一种更简单的方法是创建一个新线程和一个队列,每隔几秒钟就会有一个线程从中查找。一个例子是这样:

Queue<Integer> tasks = new ConcurrentLinkedQueue<>();

new Thread(){
    public void run() throws Exception {
        while(true){
            Integer task = null;

            if((task = tasks.poll()) != null){
                // do whatever you want
            }

            Thread.sleep(1000L); // we probably do not have to check for a change that often
        }
    }
}.start();


// add tasks
tasks.add(0);

答案 1 :(得分:0)

请参见允许您传递超时值的ExecutorService.invokeAny()方法。