黑马程序员--多线程(三)之线程停止
2012-05-21 12:32
260 查看
---------------------- android培训、java培训、期待与您交流! ----------------------
线程停止:
run方法结束就可以停止线程。
开启多线程通常代码都是循环结构,只要控制住循环就可以结束run方法,即结束线程。
特殊情况:当线程处于冻结状态(wait 、sleep...),就不会读取到标记,就无法结束线程。
这是需要对冻结线程进行清除。强制是线程恢复到运行状态,这样就可以操作标记线程城结束。Thread类提供了interrupt方法。
首先看一段线程冻结状态的代码:
以上改程序演示的是主线程结束后,线程0和线程1都处于冻结状态。
想使这两个冻结线程结束可以使用interrupt方法来中断冻结线程,此时会抛出异常。并对异常进行处理是其结束。
代码如下:
setDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。当主线程结束后该线程自动结束。
Join方法
当线程A执行到线程B的join方法时,A就会等待,等B线程结束后A再继续
执行。Join可以用来临时假如线程执行。
线程的技巧性写法示例:
---------------------- android培训、java培训、期待与您交流! ----------------------
线程停止:
run方法结束就可以停止线程。
开启多线程通常代码都是循环结构,只要控制住循环就可以结束run方法,即结束线程。
特殊情况:当线程处于冻结状态(wait 、sleep...),就不会读取到标记,就无法结束线程。
这是需要对冻结线程进行清除。强制是线程恢复到运行状态,这样就可以操作标记线程城结束。Thread类提供了interrupt方法。
首先看一段线程冻结状态的代码:
class StopThreadDemo { public static void main(String[] args) { StopThread st = new StopThread(); Thread t1 = new Thread(st); Thread t2 = new Thread(st); t1.start(); t2.start(); int num = 0; while (true) { if (num++ == 50) { st.changeFlag(); break; } System.out.println(Thread.currentThread().getName()+ "-->"+num); } } } class StopThread implements Runnable { private boolean flag = true; public synchronized void run() { while (flag) { try { this.wait();//线程0或者线程1进来之后,都处于冻结状态 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "-->run"); } } public void changeFlag() { flag = false; } }
以上改程序演示的是主线程结束后,线程0和线程1都处于冻结状态。
想使这两个冻结线程结束可以使用interrupt方法来中断冻结线程,此时会抛出异常。并对异常进行处理是其结束。
代码如下:
class StopThreadDemo { public static void main(String[] args) { StopThread st = new StopThread(); Thread t1 = new Thread(st); Thread t2 = new Thread(st); t1.start(); t2.start(); int num = 0; while (true) { if (num++ == 50) { st.changeFlag(); t1.interrupt(); t2.interrupt(); break; } System.out.println(Thread.currentThread().getName() + "-->"+num); } } } class StopThread implements Runnable { private boolean flag = true; public synchronized void run() { while (flag) { try { this.wait();//线程0或者线程1进来之后,都处于冻结状态 } catch (InterruptedException e) { flag = false; } System.out.println(Thread.currentThread().getName() + "-->run"); } } public void changeFlag() { flag = false; } }
setDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。当主线程结束后该线程自动结束。
Join方法
当线程A执行到线程B的join方法时,A就会等待,等B线程结束后A再继续
执行。Join可以用来临时假如线程执行。
线程的技巧性写法示例:
public class Demo { public static void main(String[] args) { new Thread() { public void run() { for(int i=0;i<100;i++) System.out.println("Thread-->i="+i); } }.start(); Runnable r = new Runnable(){ public void run() { for(int i=0;i<100;i++) System.out.println("Runnable-->i+"+i); } }; new Thread(r).start(); } } //该写法用的是匿名类。
---------------------- android培训、java培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员------多线程(No.3)(停止线程、守护线程、Join方法、优先级&yield方法、总结)
- 黑马程序员-多线程:停止,守护线程,join方法
- 黑马程序员---多线程之停止线程、守护线程、Join方法浅谈
- 黑马程序员 第27天 多线程安全问题 线程停止
- 黑马程序员--读写字节数组,随机读写流,集合IO的思维导图,多线程部分,单例设计模式,线程和进程的概念,Java中的线程的创建方式,线程的随机性,线程的状态图,多线程操作共享数据的安全性,死锁
- C#笔记22:多线程之停止或取消线程
- 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)
- 黑马程序员---多线程、线程间通信
- 从头认识多线程-1.8 迫使线程停止的方法-暴力Stop方法
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
- 黑马程序员------多线程(No.2)(死锁、线程间通信、生产者消费者问题)
- 黑马程序员-Java 多线程(二)-线程的同步、死锁、Lock接口
- GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断
- java基础——多线程——线程停止
- Java多线程学习笔记—线程停止
- 黑马程序员—多线程线程间的通信与同步新特性
- 黑马程序员---线程间通信、停止线程等
- 黑马程序员-18-java基础-多线程(1)-线程与同步
- 多线程提高、Lock、停止线程
- 黑马程序员——>第十二天<多线程(线程间通信-守护线程)>