理解线程的概念
掌握线程的创建和启动
了解线程的状态
掌握线程调度的常用方法
掌握线程的同步
了解为什么要学习多线程
多线程开发在软件开发领域有着重要地位
多线程开发有点明显
多线程是绝大多数面试必问点
理解进程与线程的概念
进程(打开软件开了一个进程)
应用程序的执行实例
有独立的内存空间和系统资源
线程(软件多个功能,相当于开了多个进程)
CPU调度和分派的基本单位
执行运算的最小单位,可完成一个独立的顺序控制流程
(CPU工厂 进程车间 线程工人共享车间)
理解什么是多线程
如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为”多线程“
多个线程交替占用CPU资源,而非真正的并行执行
多线程好处
充分利用CPU的资源,提升代码性能
简化编码模型,更好的软件设计和架构
带来良好的用户体验
总结:
线程
CPU调度和分派的基本单位
执行运算的最小单位,可完成一个独立的顺序控制流程
如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为”多线程“
多个线程交替占用CPU资源,而非真正的并行执行
线程初体验
通过代码初步感受线程
Thread类
Java提供了Java.lang.Thread类支持多线程编程
主线程
main()方法即为主程序入口
产生其他子线程的线程
必须最好完成执行,因为它执行各种关闭动作
掌握如何获取主线程及线程名称
//获取和设置主线程(名称)
public class MainThread{
public static void main(String[] args){
//获取当前的线程对象
Thread thread = Thread.currentThread();
//获取当前线程对象的名称
String name = thread.getName();
System.out.println("当前线程是:"+name);//main
//为当前线程重新设置名称
thread.setName("MyThread");
name = thread.getName;
System.out.println("当前线程是:"+name);//MyThread
}
}
继承Thread创建线程
掌握如何通过继承Thread创建和启动线程
在Java中创建线程的第一种方式
继承java.lang.Thread类
1、定义MyThread类继承Thread类
2、重写run()方法,编写线程执行体
3、创建线程对象,调用start()方法启动线程
//创建并启动线程
public class MyThread extends Thread{
public void run(){
for(int i = 1;i <= 100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
//测试类
public class TestThreat{
public static void main(String[] args){
//创建线程对象
MyThread mythread = new MyThread();
MyThread mythread1 = new MyThread();
//启动线程
mythread.start();
mythread1.start();
}
}
多个线程交替占用CPU资源,不是真正的“并行”
线程每次执行时长由分配的CPU时间片长度决定
启动线程是否可以直接调用run()方法?
不可以
(1)只有主线程一个执行路径
(2)依次调用了两次run()方法
run()方法被当作main()中的一个普通方法执行,失去了线程的意义
总结:
1、定义线程->2、创建线程对象->3、启动线程->4、终止线程
实现Runnable创建线程
掌握如何通过实现Runnable创建线程
定义MyRunnable类实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
//创建线程,实现Runnable接口
public class MyThread2 implements Runnable{
public void run(){
for(int i = 1;i<=100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
//测试线程
public class TestThreat2{
public static void main(String[] args){
//创建线程对象
Runnable runnable = new MyThread2;
//Thread thread = new Thread(runnable);
Thread thread = new Thread(runnable,“MyThread1”);
Thread thread2 = new Thread(runnable,“MyThread2”);
//启动线程
thread.start();
thread2.start();
}
}
总结:
定义类实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
Thread(Runnable target)
Thread(Runnable target,String name)
线程创建两种方式的区别
掌握通过继承Thread与实现Runnable创建线程的区别
在Java中创建线程的两种方式
继承java.lang.Thread类
实现java.lang.Runnable接口
继承Thread类
编写简单,可直接操作线程
适用于单继承
实现Runnable接口
避免单继承局限性
便于共享资源
(推荐使用实现Runnable接口方式创建线程)
//创建线程,模拟售票的过程
public class MyThread1 extends Thread{
private int ticket = 10;
public void run(){
for(int i = 1;i<= 10;i++){
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+"买票-"+this.ticket--);
}
}
}
}
//测试线程(继承Thread类的方式)
public class TestThread1{
public static void main(String[] args){
MyThread1 t1 = new MyThread1();
t1.setName("窗口1");
MyThread1 t2 = new MyThread1();
t2.setName("窗口2");
t1.start();
t2.start();
}
}//没有共享票数
//创建线程,模拟售票的过程
public class MyThread2 implements Runnable{
private int ticket = 10;
public void run(){
for(int i = 1;i<= 10;i++){
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+"买票-"+this.ticket--);
}
}
}
}
//测试线程(实现Runnable接口的方式)
public class TestThread2{
public static void main(String[] args){
Runnable runnable = new MyThread2();
Thread t1 = new Th