线程


线程基本要求

  • 能够描述Java中多线程运行原理
  • 能够使用继承类的方式创建多线程
  • 能够使用实现接口的方式创建多线程
  • 能够解释安全问题的出现的原因
  • 能够使用同步代码解决线程安全问题
  • 能够说出线程6个状态的名称

第一章 线程

先画个多线程执行时序图来体验一下多线程程序的执行流程。

代码如下

package com.itheima.demo06.Thread;

/**
 * @date Created by 林春燕 on 2021/3/17 22:11
 * @微信公众号 浅悦的编程时光
 * @博客 https://nate-lin.gitee.io
 * @GitHub https://github.com/nate-lin
 * @Gitee https://gitee.com/nate-lin
 */
/*
    创建多线程程序的第一种方式:创建Thread类的子类
    java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类

    实现步骤:
        1.创建一个Thread类的子类
        2.在Thread类中的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?)
        3.创建Thread类的子类对象
        4.调用Thread类中的方法,开启新的线程,执行run方法
            void start()使该线程开始执行;java虚拟机调用该线程的run()方法。
            结果是两个线程并发地运行;当前线程(main线程)和另一个线程(创建的新的线程,执行其run方法)
            多次启动一个线程是非法的。特别是当前线程已经结束执行后,不能再重新启动。
        java程序属于抢占式调度,那个线程的优先级高,那么线程优先执行,同一个优先级,随机选择一个执行。

        */
public class Demo01Thread {
    public static void main(String[] args) {
        //3.创建Thread类的子类对象
        MyThread mt=new MyThread();
        //4.调用Thread类中的方法,开启新的线程,执行run方法
        mt.start();

        for (int i = 0; i <10 ; i++) {
            System.out.println("main:"+i);
    }
  }
}
package com.itheima.demo06.Thread;

/**
 * @date Created by 林春燕 on 2021/3/17 22:30
 * @微信公众号 浅悦的编程时光
 * @博客 https://nate-lin.gitee.io
 * @GitHub https://github.com/nate-lin
 * @Gitee https://gitee.com/nate-lin
 */
//1.创建一个Thread类的子类
public class MyThread extends Thread{
    //2.在Thread类中的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?)
    @Override
    public void run(){
        for (int i = 0; i <10 ; i++) {
            System.out.println("run:"+i);
            
        }
    }
}

效果如下

1.1、多线程原理

image-20210321152450786

1.2、多线程内存图解

image-20210321154137970

1.3、Thread类

我们完成操作过程中用到了java.lang.Thread类,API中该类中定义了有关线程的一些方法,具体如下:

构造方法:

  • public Thread():分配一个新的线程对象。
  • public Thread(String name):分配一个指定名字的新的线程对象。
  • public Thread(Runnable target):分配一个带有指定目标新的线程对象。
  • public Thread(Runnable target,String name):分配一个带有指定目标新的线程对象并指定名字。

常用方法:

  • public String getName():获取当前线程名字。
  • public void start():导致此线程开始执行;Java虚拟机调用此线程对象。
  • public void run():此线程要执行的任务在此处定义代码。
  • public static void sleep(long millis):使当前正在执行的线程以指定的毫秒数暂停(暂停停止执行)。
  • public static Thread currentThread():返回对当前正在执行的线程对象引用。

翻阅API后得知创建线程的方式总共有两种,一种是继承Thread类方式,一种是实现Runnable接口方式。

代码如下

package com.itheima.demo01.getName;

/**
 * @date Created by 林春燕 on 2021/3/21 16:58
 * @微信公众号 浅悦的编程时光
 * @博客 https://nate-lin.gitee.io
 * @GitHub https://github.com/nate-lin
 * @Gitee https://gitee.com/nate-lin
 */
public class Demo01GetThreadName {
    public static void main(String[] args) {
        //创建Thread类的子类对象
        MyThread mt=new MyThread();
        //调用start方法,开启新线程,执行run方法
        mt.start();

        new MyThread().start();
        new MyThread().start();

        //链式编程
        System.out.println(Thread.currentThread().getName());
    }
}
package com.itheima.demo01.getName;

/**
 * @date Created by 林春燕 on 2021/3/21 16:58
 * @微信公众号 浅悦的编程时光
 * @博客 https://nate-lin.gitee.io
 * @GitHub https://github.com/nate-lin
 * @Gitee https://gitee.com/nate-lin
 */
/*
    获取线程的名称:
        1.使用Thread类中的方法GetName()
            String getName()返回该线程的名称
        2.可以先获取到当前正在执行的线程,使用线程中的方法getName()获取线程的名称
            static Thread currentThread()返回当前正在执行的线程对象的引用。
*/

//定义一个Thread类的子类
public class MyThread extends Thread{
    //重写Thread类中的run方法,设置线程任务
    @Override
    public void run(){
        //获取线程名称
        //String name=getName();
        //System.out.println(name);

        Thread t=Thread.currentThread();
        System.out.println(t);

        String name=t.getName();
        System.out.println(name);

        //链式编程
        System.out.println(Thread.currentThread().getName());

    }
}

效果如下

image-20210321191149083


文章作者: 浅 悦
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 浅 悦 !
评论
  目录