多线程
1.1什么是线程?什么是进程?
- 进程是一个应用程序(1个进程是一个软件)。
- 线程是一个进程中的执行场景/执行单元。
- 一个进程可以启动多个线程。
1.2Java的线程原理
对于java程序来说,当在DOS命令窗口中输入:
java HelloWorld 回车之后。
会先启动JVM,而JVM就是一个进程。
JVM再启动一个主线程调用main方法。
同时再启动一个垃圾回收线程负责看护,回收垃圾。
最起码,现在的java程序中至少有两个线程并发,
一个是垃圾回收线程,一个是执行main方法的主线程。
1.3进程与线程的关系
-
进程A和进程B的内存独立不共享。
-
在java语言中: 线程A和线程B,堆内存和方法区内存共享。 但是栈内存独立,一个线程一个栈。 假设启动10个线程,会有10个栈空间,每个栈和每个栈之间, 互不干扰,各自执行各自的,这就是多线程并发。
-
火车站,可以看做是一个进程。 火车站中的每一个售票窗口可以看做是一个线程。 我在窗口1购票,你可以在窗口2购票,你不需要等我,我也不需要等你。 所以多线程并发可以提高效率。 java中之所以有多线程机制,目的就是为了提高程序的处理效率。
1.4思考:
使用了多线程机制之后,main方法结束,是不是有可能程序也不会结束?
main方法结束只是主线程结束了,主栈空了,其它的栈(线程)可能还在压栈弹栈。
对于单核的CPU来说,真的可以做到真正的多线程并发吗?
对于多核的CPU电脑来说,真正的多线程并发是没问题的。
4核CPU表示同一个时间点上,可以真正的有4个进程并发执行。
-
什么是真正的多线程并发?
t1线程执行t1的。
t2线程执行t2的。
t1不会影响t2,t2也不会影响t1。这叫做真正的多线程并发。 -
单核的CPU表示只有一个大脑: 不能够做到真正的多线程并发,但是可以做到给人一种“多线程并发”的感觉。
对于单核的CPU来说,在某一个时间点上实际上只能处理一件事情,但是由于CPU的处理速度极快,多个线程之间频繁切换执行,跟人来的感觉是:多个事情同时在做。例: 线程A:播放音乐 线程B:运行魔兽游戏 线程A和线程B频繁切换执行,人类会感觉音乐一直在 播放,游戏一直在运行,给我们的感觉是同时并发的。
1.5java实现线程的两种方式
第一种方式:编写一个类,直接继承java.lang.Thread,重写run方法。
// 定义线程类
public class MyThread extends Thread{
public void run(){
}
}
// 创建线程对象
MyThread t = new MyThread();
// 启动线程。
t.start();
第二种方式:编写一个类,实现java.lang.Runnable接口,实现run方法。
// 定义一个可运行的类
public class MyRunnable implements Runnable {
public void run(){
}
}
// 创建线程对象
Thread t = new Thread(new MyRunnable());
// 启动线程
t.start();
注意:第二种方式实现接口比较常用,因为一个类实现了接口,它还可以去继承
其它的类,更灵活。
1.6线程的生命周期
新建状态
就绪状态
运行状态
阻塞状态
死亡状态