线程停止

java线程的五种状态

  1. 创建状态(new)
  2. 就绪状态(runnable)
  3. 运行状态(running)
  4. 阻塞状态(blocked)
  5. 死亡状态(dead)

状态变化:

说明:图片来源于 www.kuangstudy.com

简介:

  1. 线程刚创建时,是new状态
  2. 线程调用了start()方法后,进入runnable状态,此时并未真正执行,需要和其他线程竞争cpu资源
  3. 当该线程竞争到了cpu资源,进入running状态
  4. 线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态之间处于blocked状态
  • (1)等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中,进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,
  • (2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
  • (3)其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

    5.当线程正常执行结束会进入dead状态(一个未捕获的异常也会使线程终止)

注意:(有关于锁的内容后面再整理,这里先了解以下内容)

  1. yield()只是使当前线程重新回到runnable状态。
  2. sleep()会让出cpu,不会释放锁。
  3. join()会让出cpu,释放锁。
  4. wait() 和 notify() 方法与suspend()和 resume()的区别在于wait会释放锁,suspend不会释放锁。
  5. wait() 和 notify()只能运行在Synchronized代码块中,因为wait()需要释放锁,如果不在同步代码块中,就无锁可以释放。
  6. 当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒。

线程停止

建议强制停止线程的办法:

  1. 建议线程正常停止--->利用次数,不建议死循环
  2. 建议使用标志位--->设置一个标志位
  3. 不要使用stop或者destory等过时或者jdk不建议使用的方法

示例:测试停止线程(使用标志位停止线程)

上代码:

package com.kuang.thread;

/**
 * @ClassName TestStop
 * @Description 线程停止
 * @Author 麻虾
 * @Date 2021/4/26 21:29 29
 * @Version 1.0
 */

//测试停止线程

//使用标志位停止线程   建议强制停止线程的办法
public class TestStop implements Runnable{

    //1.设置一个标志位
    private boolean flag = true;

    @Override
    public void run() {
        int i = 0;
        while (flag){
            System.out.println("Thread " + i++ + "is Running");
        }
    }

    //2.设置一个公开的方法停止线程,转换标志位

    public void stop(){
        this.flag = false;
    }

    public static void main(String[] args) {

        TestStop testStop = new TestStop();
        new Thread(testStop).start();

        //主线程里执行的
        for (int i = 1; i < 100; i++) {
            //让90那个线程停止
            if(i == 90){
                //调用stop方法,切换标志位,让线程停止
                testStop.stop();
                System.out.println("该" + i +"线程停止了!");
            }else {
                System.out.println("mainThread" + i);
            }
        }
    }
}

运行结果:

mainThread1
Thread 0is Running
mainThread2
mainThread3
Thread 1is Running
mainThread4
mainThread5
mainThread6
mainThread7
mainThread8
mainThread9
Thread 2is Running
Thread 3is Running
Thread 4is Running
Thread 5is Running
Thread 6is Running
Thread 7is Running
Thread 8is Running
Thread 9is Running
Thread 10is Running
Thread 11is Running
Thread 12is Running
mainThread10
Thread 13is Running
Thread 14is Running
mainThread11
Thread 15is Running
mainThread12
mainThread13
Thread 16is Running
Thread 17is Running
Thread 18is Running
Thread 19is Running
Thread 20is Running
Thread 21is Running
Thread 22is Running
Thread 23is Running
Thread 24is Running
mainThread14
mainThread15
mainThread16
Thread 25is Running
mainThread17
mainThread18
mainThread19
Thread 26is Running
mainThread20
mainThread21
Thread 27is Running
mainThread22
Thread 28is Running
mainThread23
mainThread24
mainThread25
mainThread26
mainThread27
mainThread28
mainThread29
mainThread30
mainThread31
mainThread32
mainThread33
mainThread34
mainThread35
mainThread36
mainThread37
mainThread38
mainThread39
mainThread40
mainThread41
mainThread42
mainThread43
mainThread44
Thread 29is Running
mainThread45
mainThread46
mainThread47
mainThread48
mainThread49
mainThread50
mainThread51
mainThread52
Thread 30is Running
Thread 31is Running
Thread 32is Running
Thread 33is Running
mainThread53
Thread 34is Running
mainThread54
Thread 35is Running
mainThread55
Thread 36is Running
mainThread56
Thread 37is Running
mainThread57
Thread 38is Running
mainThread58
Thread 39is Running
mainThread59
Thread 40is Running
mainThread60
mainThread61
mainThread62
mainThread63
mainThread64
Thread 41is Running
Thread 42is Running
Thread 43is Running
Thread 44is Running
Thread 45is Running
Thread 46is Running
Thread 47is Running
Thread 48is Running
Thread 49is Running
mainThread65
mainThread66
mainThread67
mainThread68
mainThread69
Thread 50is Running
Thread 51is Running
Thread 52is Running
Thread 53is Running
Thread 54is Running
Thread 55is Running
Thread 56is Running
Thread 57is Running
Thread 58is Running
mainThread70
mainThread71
mainThread72
mainThread73
mainThread74
mainThread75
mainThread76
mainThread77
mainThread78
mainThread79
mainThread80
mainThread81
mainThread82
mainThread83
mainThread84
mainThread85
mainThread86
mainThread87
mainThread88
mainThread89
Thread 59is Running
该90线程停止了!
mainThread91
mainThread92
mainThread93
mainThread94
mainThread95
mainThread96
mainThread97
mainThread98
mainThread99

Process finished with exit code 0

可以看出,当主线程到90的时候,它被强制停止了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无霸哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值