线程基本要求
- 能够描述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、多线程原理
1.2、多线程内存图解
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());
}
}
效果如下