0

在我的应用程序中,我有MainThread并且我有SeperateThread

我的线程工作几乎完美。唯一的问题是我无法关闭SeperateThread

public void run()
{
    isRunning = true;
    while(isRunning)
    {
        Log.d(TAG, "Running...");
        long currentTime = SystemClock.uptimeMillis();
    }
}

public void StopThread()
{
    isRunning = false;
}

seperateThread.StopThread();

然后在线程中我有一个方法可以volatile boolean isRunning关闭。即使我在调试器中单步执行,注意到线程将布尔值切换为关闭。

  • 什么会导致这种类型的问题?
  • 这是关闭线程的最干净的方法吗?
  • 关闭线程的任何其他步骤?
  • 他们在 Android 多线程方面有什么挫折吗?
4

2 回答 2

2

您肯定希望为此使用新的并发包,并获取Java Concurrency in Practice的副本,并了解有关此的更多信息。线程看似简单。

为什么您的代码无法正常工作可能与您没有按照预期的方式将 isRunning 设置为 false 有关。但是,java.util.concurrency 包无论如何都会为您执行此操作。

在您的情况下,您应该查看 Executor 框架。所以你的代码可能看起来像这样:

    ExecutorService exec = Executors.newFixedThreadPool(1);//A field somewhere
    //Start your thread
    exec.submit(new Runnable(){
        @Override
        public void run() {
            while (!exec.isShutdown()) {
                Log.d(TAG, "Running...");
                //Do stuff
            }
        }
    });
    //when done
    exec.shutdown();

一夜之间想了想,这可能是一个更好的方法:

    ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
    exec.scheduleWithFixedDelay(new Runnable() {
        @Override
        public void run() {
           //Do stuff
        }
    }, 0, 1, TimeUnit.MILLISECONDS);
    //when done
    exec.shutdown();
于 2012-08-08T02:39:56.230 回答
0
isRunning = true;
while(isRunning)
{
    Log.d(TAG, "Running...");
    ...//Do something
}

你的while循环有中断吗?还是您在其他地方设置 isRunning = false?

于 2012-08-08T02:27:41.337 回答