Executor Service 没有超时,继续 运行

Executor Service does not timeout and continues to run

我有以下代码:

  def getIndustryData(String[] theIndustries) {

            PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter("result.txt")))

            //Listens to Twitter statuses and carries out the following methods on the status
            StatusListener listener = new StatusListener() {
                @Override
                void onStatus(Status status) {

                    printWriter.write(status.getLang() + "|||" + status.getText())
                    printWriter.println()
                }

                @Override
                void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {

                }

                @Override
                void onTrackLimitationNotice(int numberOfLimitedStatuses) {

                }

                @Override
                void onScrubGeo(long userId, long upToStatusId) {

                }

                @Override
                void onStallWarning(StallWarning warning) {

                }

                @Override
                void onException(Exception ex) {

                }
            }

            TwitterStream stream = new TwitterStreamFactory().getInstance()
            stream.addListener(listener)
            FilterQuery fq = new FilterQuery()
            fq.track(theIndustries)
            ExecutorService executor = Executors.newSingleThreadExecutor()

            Future<String> future = executor.submit(new Callable<String>() {
                @Override
                String call() throws Exception {

                    stream.filter(fq)
                    return null
                }
            })

            try {

                future.get(2, TimeUnit.MINUTES)

            } catch (TimeoutException e) {

                stream.removeListener(listener)
                stream.shutdown()
                future.cancel(true)
                executor.shutdownNow()

            }
        }

我正在使用 Twitter4J 访问 Twitter API.I 想将推文写入文件 2 分钟然后停止。

stream.filter(fq) 方法甚至在规定的 2 分钟后运行,并且从未达到 TimeoutException。我以为 2 分钟后异常会被捕获,我可以结束该方法,但这并没有发生。

您对 TwitterStream 的工作方式以及标准 java FutureExecutorService 的工作方式的理解有误。

TwitterStream 不适用于您提供给它的任何线程。 TwitterStream .filter 在内部启动新线程,如您在 https://github.com/yusuke/twitter4j/blob/master/twitter4j-stream/src/main/java/twitter4j/TwitterStreamImpl.java#L317 and https://github.com/yusuke/twitter4j/blob/master/twitter4j-stream/src/main/java/twitter4j/TwitterStreamImpl.java#L516

的源代码中所见

另外 Future.get 使用超时方法不能保证使用 TimeoutException 失败。如果工作很快,它只是 returns 值。这正是你的情况! stream.filter(fq) 创造新的 Thread 很快,然后你的未来立即 returns null.

让它工作的最简单(但可能不是最好)的方法是这样的

stream.filter(fq)
try
{
    Thread.sleep(2 * 60 * 1000); // just sleep on the caller thread
}
catch (InterruptedException e)
{
    // ignore
}
stream.removeListener(listener)
stream.cleanup()
//stream.shutdown()     //don't think you really need shutdown, cleanup seems to be enough