• 323 - 线程的生命周期和常用方法


    1、线程的生命周期

    【1】线程声明周期:线程开始--》线程消亡

    【2】线程经历哪些阶段: 

     2、线程常见方法

    (1)start() :  启动当前线程,表面上调用start方法,实际在调用线程里面的run方法;

    (2)run() : 线程类 继承 Thread类 或者 实现Runnable接口的时候,都要重新实现这个run方法,           run方法里面是线程要执行的内容;

    (3)currentThread :Thread类中一个静态方法:获取当前正在执行的线程;

    (4)setName 设置线程名字;

    (5)getName 读取线程名字。

    1)设置优先级

    【1】同优先级别的线程,采取的策略就是先到先服务,使用时间片策略;

    【2】如果优先级别高,被CPU调度的概率就高;

    【3】级别:1-10   默认的级别为5。

     代码示例:

    1. package test6_;
    2. /**
    3. * @Auther: zhoulz
    4. * @Description: test6_
    5. * @version: 1.0
    6. */
    7. public class TestThread01 extends Thread {
    8. @Override
    9. public void run() {
    10. for (int i = 1; i <= 10; i++) {
    11. System.out.println(i);
    12. }
    13. }
    14. }
    15. //再创建一个线程
    16. class TestThread02 extends Thread{
    17. @Override
    18. public void run() {
    19. for (int i = 20; i <= 30; i++) {
    20. System.out.println(i);
    21. }
    22. }
    23. }
    24. //测试类
    25. class Test1{
    26. public static void main(String[] args) {
    27. //创建两个子线程,让这两个子线程争抢资源:
    28. TestThread01 t1 = new TestThread01();
    29. t1.setPriority(1);//优先级别低
    30. t1.start();
    31. TestThread02 t2 = new TestThread02();
    32. t2.setPriority(10);//优先级别高
    33. t2.start();
    34. }
    35. }

    2)join

            join方法:当一个线程调用了join方法,这个线程就会先被执行,它执行结束以后才可以去执行其余的线程。

    注意:必须先start,再join才有效。

    代码示例:

    1. package test6_;
    2. /**
    3. * @Auther: zhoulz
    4. * @Description: test6_
    5. * @version: 1.0
    6. */
    7. public class TestThread extends Thread {
    8. public TestThread(String name){
    9. super(name);
    10. }
    11. @Override
    12. public void run() {
    13. for (int i = 1; i <= 10; i++) {
    14. System.out.println(this.getName()+"---"+i);
    15. }
    16. }
    17. }
    18. //测试类
    19. class Test{
    20. public static void main(String[] args) throws InterruptedException {
    21. for (int i = 1; i <= 100; i++) {
    22. //System.out.println("main---"+i);
    23. if (i == 6){ //等于6的时候才创建
    24. //创建子线程:
    25. TestThread tt = new TestThread("子线程");
    26. tt.start();
    27. tt.join();//“半路杀出个程咬金”
    28. }
    29. System.out.println("main---"+i);
    30. }
    31. }
    32. }

    运行结果:

     可见:如果出现 join()方法的话,会把别的方法置于阻塞状态。

    3)sleep

    【1】sleep : 人为的制造阻塞事件

    1. package test6_;
    2. /**
    3. * @Auther: zhoulz
    4. * @Description: test6_
    5. * @version: 1.0
    6. */
    7. public class Test3_sleep {
    8. public static void main(String[] args) throws InterruptedException {
    9. //5秒钟之后在输出 "000000000"
    10. System.out.println(System.currentTimeMillis());
    11. Thread.sleep(5000);
    12. System.out.println("000000000");
    13. System.out.println(System.currentTimeMillis());
    14. }
    15. }

    【2】案例:完成秒表功能

    1. package test6_;
    2. import javax.xml.crypto.Data;
    3. import java.text.DateFormat;
    4. import java.text.SimpleDateFormat;
    5. import java.util.Date;
    6. /**
    7. * @Auther: zhoulz
    8. * @Description: test6_
    9. * @version: 1.0
    10. */
    11. public class Test4_sleep_2 {
    12. public static void main(String[] args) throws InterruptedException {
    13. //上面时间的输出格式不喜欢
    14. //2、定义一个时间格式 —— 定义一次就行了
    15. DateFormat df = new SimpleDateFormat("HH:mm:ss");
    16. while (true){ //想要一直打印时间
    17. //1、获取当前时间:
    18. Date d = new Date();
    19. //System.out.println(d); // Wed Oct 19 16:05:44 CST 2022
    20. //3、按照上面定义的格式将Date类型转为指定格式的字符串:
    21. System.out.println(df.format(d));
    22. //隔1秒打印一次
    23. Thread.sleep(1000);
    24. }
    25. }
    26. }

    4)setDaemon

    【1】设置伴随线程

    将子线程设置为主线程的伴随线程,主线程停止的时候,子线程也不要继续执行了。

    案例:皇上 --》驾崩 ---》妃子陪葬

    代码示例:

    1. package test6_.Test5_setDaemon;
    2. /**
    3. * @Auther: zhoulz
    4. * @Description: test6_.Test5_setDaemon
    5. * @version: 1.0
    6. */
    7. public class TestThread extends Thread {
    8. @Override
    9. public void run() {
    10. for (int i = 1; i <= 1000; i++) {
    11. System.out.println("子线程---"+i);
    12. }
    13. }
    14. }
    15. //测试类
    16. class Test{
    17. public static void main(String[] args) {
    18. //创建并启动子线程:
    19. TestThread tt = new TestThread();
    20. tt.setDaemon(true);//设置伴随线程 注意:先设置,再启动
    21. tt.start();
    22. //主线程中,还要输出1-10的数字:
    23. for (int i = 1; i <= 10; i++) {
    24. System.out.println("main---"+i);
    25. }
    26. }
    27. }

    结果:

     5)stop

    代码示例:

    1. package test6_;
    2. /**
    3. * @Auther: zhoulz
    4. * @Description: test6_
    5. * @version: 1.0
    6. */
    7. public class Test6_stop {
    8. public static void main(String[] args) {
    9. for (int i = 1; i <= 100; i++) {
    10. //现要求:该程序被迫终止
    11. if (i == 6){
    12. Thread.currentThread().stop();//过期方法,不建议使用
    13. }
    14. System.out.println(i);
    15. }
    16. }
    17. }
  • 相关阅读:
    跨域问题的原理及解决方法
    Tomcat安装及配置
    互联网医院系统|互联网医院软件功能与广阔应用领域
    docker安装和优化
    L10.linux命令每日一练 -- 第二章 文件和目录操作命令 -- find和xargs命令
    【RT-Thread】nxp rt10xx 设备驱动框架之--adc搭建和使用
    【LeetCode刷题笔记】动态规划 — 70.爬楼梯
    java Map集合基本功能
    .net core DI注入,构造函数含有动态参数
    【dgl学习】dgl处理图中的节点/边的属性/特征/类型
  • 原文地址:https://blog.csdn.net/zhoulizhengZ/article/details/127408601