(黑马程序员)学习笔记,多线程(三)
来源:互联网 发布:淘宝客服职位描述 编辑:程序博客网 时间: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
- (黑马程序员)学习笔记,多线程(三)
- (黑马程序员)学习笔记,多线程(一)
- (黑马程序员)学习笔记,多线程(二)
- (黑马程序员)学习笔记,多线程(四)
- 黑马程序员——多线程学习笔记(一)
- 黑马程序员——多线程学习笔记(二)
- 黑马程序员--多线程学习笔记
- 黑马程序员----多线程学习笔记
- 黑马程序员-学习笔记-多线程
- 黑马程序员-多线程学习笔记
- 黑马程序员——多线程(三)
- 黑马程序员——多线程(三)
- 黑马程序员——集合学习笔记(三)
- 黑马程序员——IO学习笔记(三)
- 黑马程序员——Java学习笔记(三)
- 黑马程序员JAVA基础学习笔记(三)
- 黑马程序员——Java基础学习笔记(三)
- 黑马程序员-Java学习笔记之IO流(三)
- 60 Java 字符串
- myeclipse 和 eclipse 报错总结(查看第三发jar源码)
- struct和union的区别
- 通过SpringMVC整合基于注解的JPA的实例教程代码下载
- html5 [1] ~之标签初探
- (黑马程序员)学习笔记,多线程(三)
- 如何在myeclipse中更改servlet模板
- Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)
- 深入理解Java内存模型《一》基础
- 数据挖掘模型介绍之四:最近邻方法和基于记忆的推理
- springmvc请求接收参数的几种方法
- Mariadb-Host '192.168.*.*' is not allowed to connect to this MariaDB server"的解决方法
- apache kafka系列之在zookeeper中存储结构
- 文件尾追加资源,做成自解压