package com.demo;
/*
* 线程的停止方法:
* 1、调用线程的stop()方法,但是该方法已过时,不建议使用;
* 2、通过一个变量控制线程中的任务代码;
* 3、如果线程的任务代码中调用了wait()方法,需要在主线程中进行唤醒;
* 唤醒的方法有两种:notify()方法和interrupt()方法;
* 这两个方法的区别:
* 1、notify()的唤醒是温柔的;interrupt()的唤醒是强制的粗暴的,被唤醒的线程还将收到一个InterruptedException异常;
* 2、notify()必须通过锁对象来调用;interrupt()可以不必通过锁对象来调用;
* 3、notify()不能唤醒指定的线程;interrupt()可以唤醒指定的线程;
*/
public class Demo8 extends Thread{
// 通过一个变量控制线程中的任务代码,当变量值变为false时,线程停止;
boolean flag = true;
public Demo8(String name) {
super(name);
}
@Override
public synchronized void run() {
int i = 0;
while (flag){
try {
this.wait(); // 自定义线程进入等待状态,需要被唤醒;
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + i);
i++;
}
}
public static void main(String[] args) {
Demo8 d = new Demo8("自定义线程");
d.start();
for (int i = 0; i < 100; i++){
System.out.println(Thread.currentThread().getName() + ":" + i);
// 当主线程的i等于80的时候,停止自定义线程
if (i == 80){
// d.stop(); // 1、可以停止线程,但是stop()方法已过时,不建议使用,可以使用interrupt()方法代替;
// d.interrupt(); // 直接调用interrupt()方法,根本不能停止一个线程;
// d.flag = false; // 2、通过一个变量控制线程中的任务代码,也可以起到停止线程的作用;
// synchronized (d) {
// d.notify(); // 3、唤醒等待的线程(温柔的唤醒)
// }
d.interrupt(); // 把线程的等待状态强制清除(粗暴的唤醒)
// 被唤醒的线程还会收到一个InterruptedException异常;
}
}
}
}
Java学习笔记之线程(六):线程的停止
最新推荐文章于 2023-02-16 00:08:57 发布