在android中杀死线程

时间:2011-10-22 11:47:09

标签: java android

我正在使用第三方库在我的应用程序中完成一些工作。不幸的是,在它中发现了一些错误并且它们导致非常悲伤的结果:我的应用程序挂起作为工作线程可能无限循环。我已经阅读了一些关于在Android VM中杀死线程的问题,但由于以下原因,它们没有帮助我:

    不推荐使用
  1. stop()方法,不支持Bu Andriod VM
  2. interrupt()方法什么都不做,我的意思是线程还活着
  3. 最糟糕的是,从某个时刻开始,这个工作线程开始使用大量内存导致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);
                }
    

2 个答案:

答案 0 :(得分:2)

线程无法在davlik中被杀死: 我使用了AVD提出的解决方案,只是将线程的优先级设置为最低可能值并调用interrupt()方法。

答案 1 :(得分:0)

如果您可以检测到任务已停止响应,System.exit()可能至少会终止您的应用程序。