线程与进程
进程
是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间。
比如说:我们电脑上登陆在线的qq就是一个进程,占据了磁盘中一定的空间。
线程
(1)线程是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有一个线程。
(2)线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程。
线程有六种状态
1、NEW
尚未启动的线程处于此状态。
2· RUNNABLE
在Java虚拟机中执行的线程处于此状态。
3、BLOCKED
被阻塞等待监视器锁定的线程处于此状态。
4、 WAITING
无限期等待另一个线程执行特定操作的线程处于此状态。
5、 TIMED_WAITING
正在等待另一个线程执行最多指定等待时间的操作的线程处于此状态。
6、 TERMINATED
已退出的线程处于此状态。
线程调度
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。 CPU使用抢占式调度模式在多个线程间进行着高速的切换。
对于CPU的一个核心而言,某个时刻, 只能执行一个线程,而CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
同步与异步
同步:排队执行 , 效率低但是安全。
异步:同时执行 , 效率高但是数据不安全。
为什么要学习多线程?
虽然单线程一样能够处理信息,单线程只使用了cpu的一个核,
没有充分利用cpu的性能,且处理信息的速度上较慢,多线程能够充分利用cpu的性能,进行并发性地处理数据,大大加快了计算机处理数据的能力。
多线程的三种实现方式
1、第一种实现方式:创建MyThread类继承Thread类。
package Demo;
public class MyThread extends Thread{
@Override
//重写run方法
public void run() {
for(int i=0;i<3;i++){
//这条语句执行的方式不是通过run()方法,是通过Thread的对象start()来运行
System.out.println("我是子线程"+i)