在Java中如何正确地终止一个线程

1.使用Thread.stop?

   极力不推荐此方式,此函数不安全且已废弃,具体可参考Java API文档

2.设置终止标识,例如:

import static java.lang.System.out;
public class TestThread extends Thread
{
    private boolean terminationFlag;
    public void run()
    {
        for (int i = 0; i != 10000000; ++i)
        {
            if (terminationFlag)
                break;
            out.println(i + 1);
        }
    }
    public void terminate()
    {
        terminationFlag = true;
    }
}

3.使用Thread.interrupt()

   interrupt()函数本身并不能终止线程,需要做一些处理方可终止线程

   ①若线程任务中包含Object.wait()、Thread.sleep(long)等可能引发InterruptedException的函数,则在调用interrupt()后会抛出InterruptedException

import static java.lang.System.out;
import java.util.logging.Logger;
import java.util.logging.Level;
public class TestThread extends Thread
{
    private static final Logger LOGGER = Logger.getLogger("TestThread");
    public void run()
    {
        for (int i = 0; i != 10000000; ++i)
        {
            try
            {
                Thread.sleep(100);
                out.println(i + 1);
            }
            catch (InterruptedException ex)
            {
                LOGGER.log(Level.SEVERE, null, ex);
                break;  //执行break后退出循环,run()也将执行完毕
            }
        }
    }
}

②若线程任务中不包含可能引发InterruptedException的函数,则可将Thread.isInterrupted()的返回值作为终止标识

import static java.lang.System.out;
public class TestThread extends Thread
{
    public void run()
    {
        for (int i = 0; i != 10000000; ++i)
        {
            if (isInterrupted())
                break;
            out.println(i + 1);
        }
        out.println("TestThread.run() will be finished");
    }
}

猜你喜欢

转载自www.cnblogs.com/buyishi/p/9159157.html