多线程:
一、线程的定义
当我们在提到线程的时候,大多数人都会有疑问:线程是什么?有什么作用?那和程序有什么样的关系呢?因此我先来说说程序,进程,线程的概念才得。
1.1 程序
使用某种语言编写一组代码(指令)的集合,静态的。
程序在别人看来大概就是手机APP里的各种功能,例如:QQ,微信等应用。而在Java开发者角度则是用java语言编写的代码集合出来的结果。
1.2 进程
- 运行的程序,表示程序的一次完整的执行,当程序运行完成则进程也就结束了。
- 程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程。
- 每个独立执行的程序称为进程
- 每个进程都有自己独立的内存空间,进程之间的通信是很困难的。
- 进程是进行系统资源分配、调度和管理的最小单位
1.3 线程
- 一个进程中,可以同时有多条执行链路,这些执行链路称为线程
- 线程是CPU调度和分派的基本单位(最小单位),同一个进程多个线程共享这个进程的内存资源
jvm内存结构图:
1.4 进程与线程的区别
- 进程包含线程,一个进程包含多个线程,一个进程最小要包含一个线程即主线程(main)
- 运行main()方法的时候,就创建了一个main线程
- 一个进程死亡了,这个进程中所有的线程也就死亡了
- 线程销毁,进程未必会关闭
1.5 并行与并发
1.5.1 并行
定义:多CPU执行各种不同的任务
例如:三辆车三个通道,共同通过路口
1.5.2 并发
定义:一个CPU执行不同的任务(多个线程)
例如:秒杀(抢占式),三辆车一个通道
二、java实现多线程
- 在jdk1.5之前:创建线程的方式→两种(主流)
- 继承Thread类
- 实现Runnable接口
- 在jdk1.5之后:创建线程的方式→多加了两种(四种)
- 实现Callable接口
- 线程池
2.1 继承Thread类
1.编写一个类继承Thread类,该类是线程类
2.重写run(),编写该线程需要完成的任务
3.创建线程类对象
4.调用start()方法,启动线程
例子:
/**
* 实现多线程
* 继承thread
*/
public class MyTread extends Thread{
//构造方法:获取名字
public MyTread(String name) {
super(name);
}
//重写run()方法
//线程完成的功能
@Override
public void run() {
for (int i = 1; i <=5 ; i++) {
//得到当前正在运行的线程 Thread.currentThread()
//getName() 得到线程的名字
System.out.println(Thread.currentThread().getName()+"输出:"+i);
}
}
}
测试:
public class Test {
public static void main(String[] args) {
//启动线程
//创建线程对象 t1,t2,t3,main(四种对象)
MyTread t1=new MyTread("t1");
MyTread t2=new MyTread("t2");
MyTread t3=new MyTread("t3");
//调用start()启动线程,main()线程与其它线程抢占CPU资源
t1.start();
t2.start();
t3.start();
System.out.println("main() 执行完成...");
}
}
结果:
main() 执行完成...
t1输出:1
t1输出:2
t1输出:3
t1输出:4
t1输出:5
t2输出:1
t2输出:2
t2输出:3
t2输出:4
t2输出:5
t3输出:1
t3输出:2
t3输出:3
t3输出:4
t3输出:<