电脑中真正执行的是线程!但我们看到的都是进程!
进程:是由一个或N个线程组成的!
线程:CPU调度和分配的基本单位!
多线程:在同一个进程中,同时(感觉)运行多个线程,来完成不同的工作!
多线程的优点:01.充分利用CPU的资源
02.提升用户的体验
代码实现多线程的方式:
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
run()和start()的区别:
start()
01.是启动线程,是Thread类中的方法
02.不代表立即执行线程
03.底层会调用run()
run()
01.CPU分配时间片给线程是,线程真正执行
02.就是一个普通方法
03.run()写的内容 称之为 线程体
线程的生命周期:
01.新生状态 new
02.就绪状态 start();
03.运行状态 run();
04.阻塞状态
sleep();wait();yield();(礼让的线程处于就绪状态)join();
05.死亡状态
001.正常死亡 run()执行完毕
002.异常死亡 run()执行过程中出现异常,终止运行
线程的调度:
按照我们制定的方式,给多个线程设置CPU的使用权
1.线程的优先级setPriority
优先级越高 代表获取CPU的概率越高 并不代表一定执行
2.join()
让新的线程加入进来,新线程执行完毕之后,其他线程才能执行!
3.sleep(long ms) Thread类中方法
01.线程休眠,占着CPU资源不放!其他线程都无法获取CPU资源!必须等待!
02.long ms指的是在多长时间之后,进入就绪状态!
wait()是Object类中的方法!
线程wait()的时候,会释放占用的CPU资源!
01.其他的线程无需等待!
02.必须使用notify唤醒才能进入就绪状态!
4.yield()
线程的礼让,概率问题,可能礼让不成功。
5.线程的终止
01.Interrupt:只是设置线程的中断状态,不是终止线程!线程还会继续执行!
02.isInterrupted:来判断线程是否是中断状态
03.Interrupted:清楚中断状态
04.执行了wait或sleep,会默认清除中断状态
并发:synchronized
同步代码块和同步代码块方法 synchronized 给线程上锁
同步(synchronous阻塞):一个线程在执行操作时,其他线程必须等待!
异步(asynchronous非阻塞):一个线程在执行操作时,其他线程无须等待!
注意点:
1.同一个时间只有一个线程能进入synchronized修饰的代码块或方法
2.当一个线程访问synchronized代码块或者方法的时候,其他的线程等待,其他synchronized代码块也会被锁定!
3.当一个线程访问synchronized代码块或者方法的时候,其他的线程可以访问非synchronized修饰的代码块或方法!
Runnable和Callable的区别
01.Runnable接口中只有一个run()没有返回值 没有声明异常
Callable接口中只有一个call()有返回值 有声明异常
02.Callable中的call()返回值我们一般使用Future接口来接收
03.涉及了Future思想
线程的分类
用户线程:User Thread 默认我们创建的线程就是!
守护线程:Daemon Thread 为其他线程提供服务的!GC线程,需要我们设置
注意事项:
01.默认我们创建的线程就是用户线程!
通过Thread类中的setDaemon(ture)可以转换成守护线程
02.只要有用户线程存在,程序就不会终止,所有用户线程都执行完毕后,程序会结束所有守护线程!LVM停止工作!
03.setDaemon(true)必须在start()之前
04.守护线程永远不会访问资源!