线程停止的方法详解

    xiaoxiao2025-03-03  35

    线程停止的方法

    总结:

    1.设置标志位(无法处理线程阻塞时停止的问题)

    2.调用Thread类提供的stop方法强行关闭线程。(本方法现在已经不推荐使用,因为会产生不完整数据)

    3.调用Thread类提供的interrupt():

    (1)若线程中没有使用类似sleep/wait/join时,调用此线程对象的interrupt方法并不会真正中断线程,只是简单地将线程的状态置为interrupt而已,我们可以根据此状态来进一步确定如何处理线程。

    Thread类提供的public boolean isInterrupted()可以检测当前线程状态是否为中断状态

    (2)若线程中调用了阻塞线程的方法如:sleep()、wait()、join()此时再调用线程的interrupt方法时会抛出异常InterruptedException,同时将线程状态还原(isInterrupted = false),此时我们想让它停止,直接在catch块中return。

    1.设置标志位:

    (无法处理线程阻塞时停止的问题 实例1)

    代码:

    class ThreadShutDown implements Runnable{ private boolean flag = true; public void setFlag(boolean flag){ this.flag = flag; } @Override public void run() { int i=0; while(flag){ System.out.println(Thread.currentThread().getName()+","+i++); } System.out.println("线程停止"); } } public class ThreadStop { public static void main(String[] args) throws InterruptedException { ThreadShutDown threadShutDown = new ThreadShutDown(); Thread thread = new Thread(threadShutDown); thread.start(); Thread.sleep(1000);//运行1秒后将其关掉 threadShutDown.setFlag(false); } }

    运行结果:

    代码:实例1

    class ThreadShutDown2 implements Runnable{ private boolean flag = true; public void setFlag(boolean flag){ this.flag = flag; } @Override public void run() { int i=0; while(flag){ try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("线程停止"); } } public class ThreadStop { public static void main(String[] args) throws InterruptedException { ThreadShutDown2 threadShutDown = new ThreadShutDown2(); Thread thread = new Thread(threadShutDown); thread.start(); thread.sleep(200); threadShutDown.setFlag(true); } }

    结果:

    2.调用Thread类提供的stop方法强行关闭线程:

    (本方法现在已经不推荐使用,可能会产生不完整数据,如下面中的“线程停止”并没有输出)

    代码:

    public class ThreadStop { public static void main(String[] args) throws InterruptedException { ThreadShutDown threadShutDown = new ThreadShutDown(); Thread thread = new Thread(threadShutDown); thread.start(); Thread.sleep(1000); thread.stop();//调用Thread类提供的stop方法强行关闭线程。 } }

    运行结果:

    3.调用Thread类提供的interrupt():

    (1)若线程中没有使用类似sleep/wait/join时,调用此线程对象的interrupt方法并不会真正中断线程,只是简单地将线程的状态置为interrupt而已(实例2),我们可以根据此状态来进一步确定如何处理线程(实例3)。

    Thread类提供的public boolean isInterrupted()可以检测当前线程状态是否为中断状态。

    代码:实例2

    class ThreadShutDown2 implements Runnable{ private boolean flag = true; public void setFlag(boolean flag){ this.flag = flag; } @Override public void run() { int i=0; while(flag){ boolean bool = Thread.currentThread().isInterrupted(); System.out.println("当前线程状态为:"+bool); System.out.println(Thread.currentThread().getName()+","+i++); } System.out.println("线程停止"); } } public class ThreadStop { public static void main(String[] args) throws InterruptedException { ThreadShutDown2 threadShutDown = new ThreadShutDown2(); Thread thread = new Thread(threadShutDown); thread.start(); Thread.sleep(1000); thread.interrupt(); } }

    结果:

    只是将线程的状态置为interrupt而已,并没有停止

    代码:实例3

    class ThreadShutDown2 implements Runnable{ private boolean flag = true; public void setFlag(boolean flag){ this.flag = flag; } @Override public void run() { int i=0; while(flag){ boolean bool = Thread.currentThread().isInterrupted(); if(bool){ System.out.println("线程已被中断"); return; } System.out.println("当前线程状态为:"+bool); System.out.println(Thread.currentThread().getName()+","+i++); } System.out.println("线程停止"); } } public class ThreadStop { public static void main(String[] args) throws InterruptedException { ThreadShutDown2 threadShutDown = new ThreadShutDown2(); Thread thread = new Thread(threadShutDown); thread.start(); Thread.sleep(1000); thread.interrupt(); } }

    结果:

    此时又与方法一类似了。

    (2)若线程中调用了阻塞线程的方法如:sleep()、wait()、join()此时再调用线程的interrupt方法时会抛出异常InterruptedException,同时将线程状态还原(isInterrupted = false)  (实例4)

    代码:实例4

    class ThreadShutDown2 implements Runnable{ private boolean flag = true; public void setFlag(boolean flag){ this.flag = flag; } @Override public void run() { int i=0; while(flag){ try { Thread.sleep(200); boolean bool = Thread.currentThread().isInterrupted(); if(bool){ System.out.println("线程已被中断"); return; } System.out.println("当前线程状态为:"+bool); System.out.println(Thread.currentThread().getName()+","+i++); } catch (InterruptedException e) { boolean bool = Thread.currentThread().isInterrupted(); if(bool){ System.out.println("线程已被中断"); return; } System.out.println("当前线程状态为:"+bool); System.out.println(Thread.currentThread().getName()+","+i++); e.printStackTrace(); } } System.out.println("线程停止"); } } public class ThreadStop { public static void main(String[] args) throws InterruptedException { ThreadShutDown2 threadShutDown = new ThreadShutDown2(); Thread thread = new Thread(threadShutDown); thread.start(); thread.interrupt(); } }

    结果:

    此时我们想让它停止,直接在catch块中return;

    class ThreadShutDown2 implements Runnable{ private boolean flag = true; public void setFlag(boolean flag){ this.flag = flag; } @Override public void run() { int i=0; while(flag){ try { Thread.sleep(200); boolean bool = Thread.currentThread().isInterrupted(); if(bool){ System.out.println("线程已被中断"); return; } System.out.println("当前线程状态为:"+bool); System.out.println(Thread.currentThread().getName()+","+i++); } catch (InterruptedException e) { System.out.println("抛出中断异常"); return ; } } System.out.println("线程停止"); } } public class ThreadStop { public static void main(String[] args) throws InterruptedException { ThreadShutDown2 threadShutDown = new ThreadShutDown2(); Thread thread = new Thread(threadShutDown); thread.start(); thread.sleep(1000); thread.interrupt(); } }

    结果:

     

    最新回复(0)