java线程怎么停止?java线程停止方法

阳光 2022-04-06 23:39:02 java常见问答 6914

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。并且Java线程有创建启动就有停止,那java线程怎么停止?下面我们给大家分享一些java线程停止方法,希望给大家带来一些参考!

1:异常法停止

线程调用interrupt()方法后,在线程的run方法中判断当前对象的interrupted()状态,如果是中断状态则抛出异常,达到中断线程的效果。

如下示例:

MyThread.java

public class MyThread extends Thread
{
    @Override
    public void run()
    {
        try
        {
            for (int i = 0; i < 500000; i++)
            {
                if (MyThread.interrupted())
                {
                    System.out.println("已经是停止状态了,我要退出了!");
                    throw new InterruptedException();
                }
                System.out.println("i = " + (i + 1));
            }
            System.out.println("如果我被输出了,则代表线程没有停止");
        }
        catch (InterruptedException e)
        {
            System.out.println("在MyThread类中的run方法中被捕获");
            e.printStackTrace();
        }
    }
}

Main.java

/**
* 根据中断状态退出for循环
* @Author: xjf
* @Date: 2019/5/25 13:27
*/
public class Main
{
    public static void main(String[] args)
    {
        try
        {
            MyThread myThread = new MyThread();
            myThread.start();
            Thread.sleep(100);
            myThread.interrupt();
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        System.out.println("end!");
    }
}

结果如下:

i = 19115
i = 19116
i = 19117
i = 19118
i = 19119
end!

已经是停止状态了,我要退出了!

在MyThread类中的run方法中被捕获

java.lang.InterruptedException

at com.book.interrupt_exit.MyThread.run(MyThread.java:15)

Process finished with exit code 0

2.stop()暴力停止

线程调用stop()方法会被暴力停止,方法已弃用。该方法会有不好的后果:

(1)强制让线程停止有可能使一些请理性的工作得不到完成。

(2)对锁定的对象进行了“解锁”,导致数据得不到同步的处理,出现数据不一致的问题(比如一个方法加上了synchronized,并在其中进行了一个长时间的处理,而在处理结束之前该线程进行了stop(),则未完成的数据将没有进行到同步的处理)

3.使用return停止线程

调用interrupt标记为中断状态后,在run方法中判断当前线程状态,如果为中断状态则return,能达到停止线程的效果。

备注:建议使用“抛异常”的方法来实现线程的停止,因为在catch块中还可以将异常向上抛,使线程停止的事件得以传播。

4. 使用interrupt方法终止线程

使用interrupt方法来终端线程可分为两种情况:

(1)线程处于阻塞状态,如使用了sleep方法。

(2)使用while(!isInterrupted()){……}来判断线程是否被中断。

在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出。下面的代码演示了在第一种情况下使用interrupt方法。

package chapter2;
public class ThreadInterrupt extends Thread
{
    public void run()
    {
        try
        {
            sleep(50000); // 延迟50秒
        }
        catch (InterruptedException e)
        {
            System.out.println(e.getMessage());
        }
    }
    public static void main(String[] args) throws Exception
    {
        Thread thread = new ThreadInterrupt();
        thread.start();
        System.out.println("在50秒之内按任意键中断线程!");
        System.in.read();
        thread.interrupt();
        thread.join();
        System.out.println("线程已经退出!");
    }
}

上面代码的运行结果如下:

在50秒之内按任意键中断线程!

sleep interrupted

线程已经退出!

Java线程停止就是利用以上这4种方法,当然我们在让线程停止的时候,也要注意线程停止方法,避免带来一些安全隐患!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。

推荐阅读:

json格式如何创建?json怎样创建简单的对象?

多线程和线程池面试题有哪些?多线程和线程池面试题总结

java开发网站用什么框架?为什么java开发要用框架?