Java线程 - 需要注意的事项?

时间:2012-08-08 01:57:54

标签: java android thread-safety

在我的申请中,我有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。即使我在调试器中单步执行,注意到线程将布尔值切换为关闭。

  • 会导致此类问题的原因是什么?
  • 这是关闭线程最干净的方法吗?
  • 关闭线程的其他任何步骤?
  • 他们在Androids中的任何挫折多线程吗?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

isRunning = true;
while(isRunning)
{
    Log.d(TAG, "Running...");
    ...//Do something
}

你的while循环中断了吗?或者你在其他地方设置isRunning = false?