Ali*_*emi 0 java performance multithreading
我有一个程序来读取一些RSS源,解析它们,并将链接复制到其他地方.好!我想大约每10分钟检查RSS提要以获得可能的更新.我写了这段代码:
@Override
public void run() {
while (true) {
// check feeds here
try {
Thread.sleep(600000);
} catch (InterruptedException ex) {
// exception handing
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它,一两天,它就可以运行了.但通常在3或4天后,它会进入睡眠状态并且永远不会再次醒来!所以它不会更新RSS提要.
我怎样才能解决这个问题!?
如果我不得不猜测我会说代码中可能存在一个错误,它会读取提取未处理异常的提要,这反过来会结束该提示.对你而言,似乎线程永远不会醒来,而事实上它已经死了.
public void run() {
while (true) {
// check feeds here <<<---- Look for the bug here
try {
Thread.sleep(600000);
} catch (InterruptedException ex) {
// exception handing
}
}
}
Run Code Online (Sandbox Code Playgroud)
Thread.sleep方法中存在一个错误是非常不可能的(因为它几乎在所有地方都被广泛使用).无论如何,调试并检查您的线程是否仍处于活动状态或是否已经死亡.
试试java executor库.它们是在java 5中引入的,它使这种代码更高效,更清晰.
ScheduledExecutorService es = Executors.newScheduledThreadPool(1);
es.schedule(new Runnable(){
@Override
public void run() {
//RSS checking
}
}, 10, TimeUnit.MINUTES);
Run Code Online (Sandbox Code Playgroud)
这些库中有很多内容,所以值得一试.
也许它因为记忆或类似的东西而停止.尝试上述方法每10分钟检查一次.
还有Callable(而不是Runnable)的概念,它允许抛出可能有助于您调试此异常的异常.您将获得一个可以用来帮助的未来对象.这个链接看起来很不错http://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-callable.html
| 归档时间: |
|
| 查看次数: |
3992 次 |
| 最近记录: |