(黑马程序员)学习笔记,多线程(三)

来源:互联网 发布:淘宝客服职位描述 编辑:程序博客网 时间:2024/06/08 17:56

停止线程

目前线程停止方法 stop() 已经过时,若要停止线程则只有将线程中的 run() 方法结束。

package thread;/** * 线程停止方法stop()已经过时。 * 如何让线程停止呢? * 只有一种方式,那就是结束run()方法。 * 开启多线程运行,运行代码通常是循环结构,因此只要控制住循环就可以结束run()方法,也就结束了线程 * @author asus * */public class StopThreadDemo {public static void main(String[] args) {int n=0;StopThread st = new StopThread(n);Thread t = new Thread(st);Thread t2 = new Thread(st);t.start();t2.start();while(true){if(n++==60){//调用改变标志位的方法,停止线程st.stopRun();break;}System.out.println(Thread.currentThread().getName()+"..."+n+"...在运行");}}}//简单的线程可以通过控制循环标志位来结束线程class StopThread implements Runnable{//循环标志位初始为trueprivate boolean flag = true;private int n;public StopThread(int n){this.n = n;}//对外提供改变标志位的方法,并将标志位置为false,停止线程public void stopRun(){flag = false;}public void run(){//线程循环用标志位控制while(flag){System.out.println(Thread.currentThread().getName()+"..."+this.n+"...在运行");n++;}}}

但是这样的方式只能结束简单的线程,如果线程中有wait() 这会使线程永远等待(和死锁现象很像,但是不会占用资源)。因此遇到这种情况就需要用到 interrupt() 来清除等待线程。

package thread;/** * 线程停止方法stop()已经过时。 * 如何让线程停止呢? * 只有一种方式,那就是结束run()方法。 * 开启多线程运行,运行代码通常是循环结构,因此只要控制住循环就可以结束run()方法,也就结束了线程 * @author asus * */public class StopThreadDemo {public static void main(String[] args) {int n=0;StopThread st = new StopThread(n);Thread t = new Thread(st);Thread t2 = new Thread(st);t.start();t2.start();while(true){if(n++==60){//调用强制中断等待线程t.interrupt();t2.interrupt();break;}System.out.println(Thread.currentThread().getName()+"..."+n+"...在运行");}System.out.println("Over");}}//简单的线程可以通过控制循环标志位来结束线程class StopThread implements Runnable{//循环标志位初始为trueprivate boolean flag = true;private int n;public StopThread(int n){this.n = n;}//对外提供改变标志位的方法,并将标志位置为false,停止线程public void stopRun(){flag = false;}public synchronized void run(){//线程循环用标志位控制while(flag){try {wait();} catch (InterruptedException e) {System.out.println(Thread.currentThread().getName()+"..."+this.n+"...被中断");//强制中断后,改变标志位,停止线程stopRun();}System.out.println(Thread.currentThread().getName()+"..."+this.n+"...在运行");n++;}}}

另外在启动线程之前使用 setDaemon(true) 可以将线程设置为守护线程(即后台线程,当所有前台线程结束后,后台线程自动结束)

package thread;/** * 守护线程 */public class DaemonDemo {public static void main(String[] args) {int n=0;DeamonThread st = new DeamonThread(n);Thread t = new Thread(st);Thread t2 = new Thread(st);//setDeamon()将线程标记为守护线程(后台线程,当所有前台线程结束后,后台线程自动结束)t.setDaemon(true);t.setDaemon(true);t.start();t2.start();while(true){if(n++==60){//结束主线程break;}System.out.println(Thread.currentThread().getName()+"..."+n+"...在运行");}System.out.println("Over");}}//简单的线程可以通过控制循环标志位来结束线程class DeamonThread implements Runnable{private int n;public DeamonThread(int n){this.n = n;}public synchronized void run(){//因为是守护线程,即使循环标志位不变,只要前台线程结束,守护线程依然会结束while(true){System.out.println(Thread.currentThread().getName()+"..."+this.n+"...在运行");n++;}}}


0 0