• Java实现多线程的三种方式(1) ------继承Thread类


    1、继承Thead类

     1 package com.cn.donleo.thread.impl;
     2 
     3 /**
     4  * @author liangd
     5  * date 2020-10-31 15:29
     6  * code 继承Thread类
     7  */
     8 public class MyThreadByThread extends Thread {
     9 
    10     /**
    11      * 构造方法,继承父类可直接super
    12      *
    13      * @param name
    14      */
    15     MyThreadByThread(String name) {
    16         super(name);
    17     }
    18 
    19     @Override
    20     public void run() {
    21         for (int i = 0; i < 50; i++) {
    22             System.out.println("第" + i + "个 MyThread: " + getName());
    23         }
    24     }
    25 }

    2、测试类

     1 package com.cn.donleo.thread.impl;
     2 
     3 /**
     4  * @author liangd
     5  * date 2020-10-31 15:35
     6  * code 测试Thread
     7  */
     8 public class TestThread {
     9 
    10     /**
    11      * 一、步骤
    12      *  1、定义 Thread 类的子类 并重写该类的 Run 方法,该 run 方法的方法体就代表了该线程需要完成的任务
    13      *
    14      *  2、创建 Thread 类的实例,即创建了线程对象
    15      *
    16      *  3、调用线程的 start 方法来启动线程
    17      *
    18      * 二、start和run方法的区别
    19      * 1、start
    20      *    用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。
    21      *    通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,
    22      *    一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,
    23      *    Run方法运行结束,此线程随即终止。
    24      * 2、run
    25      *    run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,
    26      *    其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,
    27      *    这样就没有达到写线程的目的。
    28      *
    29      * 3、直接执行run方法
    30      *    myThread.run();
    31      *    结果表示对创建的对象进行方法的调用,而没有开启线程,等于普通方法
    32      *    start方法,开启线程,是由cpu去自动分配线程调用
    33      * 4、为什么要重写run方法?
    34      *    run方法是用来封装执行的代码
    35      * @param args
    36      */
    37     public static void main(String[] args){
    38         MyThreadByThread thread1 = new MyThreadByThread("线程1");
    39         MyThreadByThread thread2 = new MyThreadByThread("线程2");
    40 
    41         //线程执行,如果直接调用,相当于普通方法,没有开启线程,按顺序执行
    42 //        thread1.run();
    43 //        thread2.run();
    44         //线程就绪,执行顺序有CPU调用,顺序会发生变化,可以设置执行优先级
    45         thread1.start();
    46         thread2.start();
    47         /*
    48           线程生命周期:
    49           1、线程创建(new)
    50              新创建了一个线程对象
    51           2、线程就绪(Runnable)
    52              1)线程对象创建后,其他线程调用了该对象的start()方法。
    53              2)该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权
    54              3)有执行资格,但是没有执行权力,但可以开始抢CPU的使用权力
    55           3、线程运行(Running)
    56              就绪状态的线程获取了CPU,执行程序代码
    57           4、线程阻塞(Blocked)
    58              阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。
    59              直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种
    60              (一)等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)
    61              (二)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中
    62              (三)其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,
    63                       JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,
    64                       线程重新转入就绪状态。(注意,sleep是不会释放持有的锁)
    65           5、线程死亡(Dead)
    66              线程执行完了或者因异常退出了run()方法,该线程结束生命周期
    67          */
    68     }
    69 }
    作者:donleo123
    本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。
  • 相关阅读:
    js 截取指定的字符串
    WebSocket实例 Vue中使用websoket
    Vue 水半球样式、圆形水进度条、在线编辑
    Elasticsearch学习笔记3 -- 文档操作
    Elasticsearch学习笔记2 -- 索引库的操作
    Elasticsearch学习笔记1 -- 安装elasticsearch
    Docker学习笔记5 -- Docker-compose
    Docker学习笔记4 -- Dockerfile
    Docker学习笔记3 -- 数据卷
    Docker学习笔记2 -- 常用命令
  • 原文地址:https://www.cnblogs.com/donleo123/p/14069803.html
Copyright © 2020-2023  润新知