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 Future
和 ExecutorService
的工作方式的理解有误。
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
我有以下代码:
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 Future
和 ExecutorService
的工作方式的理解有误。
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