如何杀死一个线程或停止一个线程?

时间:2019-11-21 17:05:59

标签: java android multithreading

我的Java代码在单击按钮时创建了一个线程。 每次单击该按钮都会创建一个线程。 如果再次单击按钮,我想杀死前一个线程。 我怎样才能做到这一点? 以下是buttonclicklistener内的部分代码

myThread= new Thread() 
                {
                    public void run() {
                        diff2 = Math.abs(d3.getTime() - d1.getTime());
                        long diffseconds = diff2 /1000;
                        final long start = System.currentTimeMillis()/1000;
                        tv_timecount=(TextView)findViewById(R.id.tv_timeCount);
                        while(diffseconds>0)
                        {
                            tv_timecount.setText(String.valueOf(diffseconds--));
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            if(myThread.isInterrupted())
                                break;

                        }
                    }
                };
                myThread.start();

我要停止该线程。

3 个答案:

答案 0 :(得分:2)

很多方式,

1:使用不建议使用的停止

Thread t = new Thread();
t.start();
t.stop(); //this is deprecated but it stops the thread

2:使用中断

Thread t = new Thread();
t.start();
t.interrupt();

3:使用while循环杀死线程

boolean running = true;
Thread t = new Thread(() -> { 
    while (running) {
       System.out.println("Running");

       try { Thread.sleep(100); } catch (Throwable t) {}
    }
});
t.start();
running = false;

答案 1 :(得分:1)

您没有提到为什么您无法完全停止线程,所以我假设您可能遇到哪些问题。

1。中断在您的代码中不起作用的主要原因是因为您抓住InterruptedException并对此打了个电话。但是之后,您应该使用Thread.currentThread().interrupt()

自己设置中断标志

2。您可以同时单击按钮两次或两次以上,因此所有单击都将尝试停止同一线程,但是每次单击都会启动自己的线程,因此,除了其中一个线程外,其他所有线程(或指向他们的指针)将从您那里泄漏。这可以使用同步功能解决。 处理按钮单击的常规代码应类似于以下代码:

private Thread myThread;
private synchronized void buttonClick() throws InterruptedException //NOTE synchronized
{
    if (myThread != null) {
        myThread.interrupt();
        myThread.join();
    }

    myThread = new Thread(() -> {
        diff2 = Math.abs(d3.getTime() - d1.getTime());
        long diffseconds = diff2 / 1000;
        final long start = System.currentTimeMillis() / 1000;
        tv_timecount = (TextView) findViewById(R.id.tv_timeCount);
        while (diffseconds > 0) {
            tv_timecount.setText(String.valueOf(diffseconds--));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt(); // NOTE: flag interrupt gets set
            }
            if (myThread.isInterrupted())
                break;
        }
    });
}

答案 2 :(得分:0)

最好的方法是使用一个标志。在您的while方法中引入一个标志,添加逻辑以检查是否设置了标志,然后才在while循环中执行代码。

while(diffseconds>0)
{
    synchronized(Object.class){
    if(flag == set) break;
    }
 //your code
}

您可以在其他线程或主要执行中单击按钮时重置/设置标志。