我正在使用第三方库在我的应用程序中完成一些工作。不幸的是,在它中发现了一些错误并且它们导致非常悲伤的结果:我的应用程序挂起作为工作线程可能无限循环。我已经阅读了一些关于在Android VM中杀死线程的问题,但由于以下原因,它们没有帮助我:
最糟糕的是,从某个时刻开始,这个工作线程开始使用大量内存导致GC过于频繁地运行,这对app来说也不好。
我发现库中的错误发生了一些情况,但我可能还有其他错误,我也想在我的应用程序中避免。
以下是显示问题的ode片段:
final MutableObject<Object> calculationResult = new MutableObject<Object>(null);
final MutableObject<EvalError> exception = new MutableObject<EvalError>(null);
final MutableObject<Thread> calculationThread = new MutableObject<Thread>(null);
final CountDownLatch latch = new CountDownLatch(1);
new Thread(new Runnable() {
@Override
public void run() {
final Thread thread = Thread.currentThread();
try {
Log.d(CalculatorEngine.class.getName(), "Calculation thread started work: " + thread.getName());
calculationThread.setObject(thread);
calculationResult.setObject(interpreter.eval(jsclExpression));
} catch (EvalError evalError) {
exception.setObject(evalError);
} finally {
Log.d(CalculatorEngine.class.getName(), "Calculation thread ended work: " + thread.getName());
calculationThread.setObject(null);
latch.countDown();
}
}
}).start();
try {
Log.d(CalculatorEngine.class.getName(), "Main thread is waiting: " + Thread.currentThread().getName());
latch.await(4, TimeUnit.SECONDS);
Log.d(CalculatorEngine.class.getName(), "Main thread got up: " + Thread.currentThread().getName());
final EvalError evalErrorLocal = exception.getObject();
final Object calculationResultLocal = calculationResult.getObject();
final Thread calculationThreadLocal = calculationThread.getObject();
if (calculationThreadLocal != null) {
// todo serso: interrupt doesn't stop the thread but it MUST be killed
calculationThreadLocal.interrupt();
resetInterpreter();
}
if ( evalErrorLocal != null ) {
throw evalErrorLocal;
}
if ( calculationResultLocal == null ) {
tooLongExecutionCache.add(jsclExpression);
throw new ParseException("Too long calculation for: " + jsclExpression);
}
} catch (InterruptedException e) {
throw new ParseException(e);
}
答案 0 :(得分:2)
线程无法在davlik中被杀死:
我使用了AVD提出的解决方案,只是将线程的优先级设置为最低可能值并调用interrupt()
方法。
答案 1 :(得分:0)
如果您可以检测到任务已停止响应,System.exit()可能至少会终止您的应用程序。