android - 如何在需要时停止运行线程并在需要时启动线程

原文 标签 android multithreading

下面的代码仅启动线程一次,但是我想通过调用下面的方法来停止并重新启动线程。

Thread th;
int t=45;

onstartbuttton()
{
th= new Thread(new callmymethod());
        th.start();
}
onstopbutton()
{
}

public class callmymethod implements Runnable {
        // TODO Auto-generated method stub

        @SuppressWarnings("null")
        @Override
        public void run() {
            // TODO Auto-generated method stub

            while(t>-1){

                try{

                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub

                            time_btn.setText(""+t);

                            if(t==0)
                            {                               
                                Toast.makeText(getApplicationContext(), "Thread over", Toast.LENGTH_SHORT).show();

                            }
                        }
                    });Thread.sleep(1000);
                //  Log.i("Thread", "In run"+t);
                    t=t-1;

                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
    }

现在,我想停止线程,因此我必须在onstopbutton()方法中编写什么内容,以及如何通过调用onstartbutton()方法来重新启动。

最佳答案

您需要在线程中添加一个标志,指示它应该停止运行。

您可以使用AtomicBoolean:

final AtomicBoolean flag = new AtomicBoolean();

onstartbuttton() {
    th= new Thread(new callmymethod(flag));
    flag.set(true);
    th.start();
}
onstopbutton() {
    flag.set(false); // indicate that the thread should stop
}

public class callmymethod implements Runnable {
    public AtomicBoolean flag;
    public callmymethod(AtomicBoolean flag) {
        this.flag = flag;
    }
    @Override
    public void run() {
        int t = 45;  // start back from 45
        while(t>-1 && flag.get()){
            // do as before
        }
    }
}

关于android - 如何在需要时停止运行线程并在需要时启动线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23671487/

相关文章:

java - 计算放置在具有不同速度和方向的其他两个对象中间的对象的速度

android - 不使用 Intent 切换 Activity

java - 在构造函数外部初始化的final字段是否在运行构造函数之前被初始化?

java - 使用 java.util.concurrent.locks.Lock 而不是同步的 : can my code avoid dead-lock in a bank transfer scenario?

java - 以编程方式访问资源名称

android - 传递给 singleArgViewModelFactory 时::MainViewModel 是什么意思

java - 以编程方式启用画中画模式

Java 每月计时器

c# - 监听 IEnumerable<T> 时 BlockingCollection 的 Queue.Peek() 类比

multithreading - DBX 错误 : Driver could not be properly initialized when use OmniThreadLibrary (but ok otherwise)