1.进程和线程
- 进程是一个应用程序(一个进程是一个软件)
- 线程是一个进程中的执行场景/执行单元
- 一个进程可以启动多个线程
- 进程可以看作是现实生活当中的公司
- 线程可以看作是公司当中的某个员工
- 进程A和进程B的内存独立不共享
- 线程A和线程B,堆内存和方法区内存共享,但是栈内存独立,一个线程一个栈
- 假设启动10个线程,会有10个栈空间,每个栈和每个栈之间,互不干扰,各自执行各自的,这就是多线程并发
- 多线程并发可以提高效率
- java中之所以有多线程机制,目的就是为了提高程序的处理效率
- 使用了多线程机制之后,main方法结束,只代表主线程结束了,其他线程可能还在执行
2.多线程并发
- 对于多核的cpu电脑来说,真正的多线程并发没有问题
- 4核cpu表示同一个时间点上,可以真正的有4个线程并发执行
- 什么是多线程并发
- t1线程执行t1的,t2线程执行t2的,t1不会影响t2,t2也不会影响t1,这叫做真正的多线程并发
- 单核cpu表示只有一个大脑
- 不能做到真正的多线程并发,但是可以做到给人一种多线程并发的感觉
3.java语言中实现线程有两种方式
- java支持多线程机制,并且java已经将多线程实现了,我们只需要继承就可以了
- 编写一个类,直接继承java.lang.Thread,重写run方法
public class ThreadTest{ public static void main(String[] args){ //新建分支对象 MyThread myTread = new Mythread(); //启动线程 myThread.start(); //代码还是运行在主线程中 for(int i = 0; i < 1000; i++){ System.out.println("主线程-->" + i ); } } } class Mythread extends Thread{ public void run(){ for(int i = 0; i < 1000; i++){ System.out.println("分支线程--->" + i); } } }
void start()
- 使该线程开始执行;Java 虚拟机调用该线程的
run
方法。- 结果是两个线程并发地运行;当前线程(从调用返回给
start
方法)和另一个线程(执行其run
方法)。- 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
- 启动一个分支线程,在jvm中开辟一个新的栈空间,这段代码任务完成以后,瞬间就结束了,这段代码的任务只是为了开辟一个新的栈空间,只要新的栈空间开辟出来,start()方法就结束了。线程就启动成功了
- 启动线程会自动调用run方法,并且run()方法在分支的栈底部(压栈)。
- run方法在分支栈的栈底部,main方法在主栈的栈底部,run和main是平级的
void run()
- 如果该线程是使用独立的
Runnable
运行对象构造的,则调用该Runnable
对象的run
方法;否则,该方法不执行任何操作并返回。
Thread
的子类应该重写该方法。编写一个类,实现java.lang.Runnable接口,实现run方法
public class TreadTest01{ public static void main(String[] args){ MyRunnable() r = new MyRunnable(); Tread t = new Tread(r); t.start(); for(int i = 0; i < 100; i++){ System.out.println("主线程-->" + i); } } } class MyRunnable implements Runnable{ public void run(){ for(int i = 0; i < 100; i++){ System.out.println("分支线程-->" + i); } } }
第二种方式实现接口比较常用,因为一个类实现了接口,它还可以去继承其他的类,更灵活
4.线程声明周期
- 就绪状态的线程又叫做可运行状态,表现hi当前线程酷游抢夺cpu时间片的权利(cpu时间片就是执行权)。当一个线程抢到cpu时间片之后,就开始执行run方法,run方法的开始执行标志着线程进入运行状态
- run方法的开始执行标志着这个程序进入运行状态,当之前占有的cpu时间片用完之后,会重新回到就绪状态继续抢夺cpu时间片,当再次抢到cpu时间之后,会重新进入run方法,接着上一次的代码继续往下执行
- 当一个线程遇到阻塞事件,例如接收用户键盘输入,或者sleep方法等,此时线程会进入阻塞状态,阻塞状态的线程会放弃之前占有的时间片
- 之前的时间片没了,需要再次回到就绪状态,抢夺cpu时间片
- 新建状态
- 就绪状态
- 运行状态
- 阻塞状态
- 死亡状态
5.获取线程的名字