学习内容:
线程基础知识了解:
进程:运行中的程序,操作系统会为该进程分配内存空间,是指程序的一次执行过程。
单线程:
同一时刻,只允许执行一个线程。
多线程:同一时刻允许执行多个线程。
并发:
同一时刻,多个线程交替执行(单核CPU)
并行:同一时刻,多个任务同时执行(多核CPU)
进程并不会因为主线程的终止而终止,只有当进程中的所有线程都结束之后才会结束。
创建线程的方式:
1.继承Thread类。
2.实现Runnable接口。
3.实现Callable接口。
4.从线程池中获取。
Thread:
在执行的时候会先去调用 .start 来启用一个线程,如果直接去掉 .run方法的话还是在当前线程中执行代码,会造成代码串行化。
注意:.strat方法中有一个 .start0方法,真正实现多线程的时start0方法,它是通过调用底层Native方法来实现多线程效果的,它是由JVM来实现调用的。
调用start方法之后,该线程不会立刻执行,只是将线程状态变成了可运行状态,具体什么时候执行取决于CPU的调度。
Runnable:
不能调用start方法,创建了Thread对象,把对象(实现Runnable)放入Thread然后再执行start方法就可以执行run方法(因为这里使用到了静态代理模式)。
线程结束方式:
用户线程:当线程的任务执行完或通知方式结束。
守护线程:一般是为工作线程服务的,当所有用户线程结束,守护线程会自动结束
常见的守护线程:垃圾回收机制
将线程设置成守护线程: 线程名.setDaemon(true)
线程生命周期:
new : 尚未启动,或者说是刚刚创建一个线程。
Runnable: Java虚拟机中执行的线程处于此状态,内部分为Ready和Running。
Blocked:被阻塞,当遇到上锁的资源时,当前线程会进入阻塞状态,当获得锁之后会再次进入到Runnable状态。
waiting:等待状态,当线程使用waite方法的时候会进入这个状态,当使用notify方法或者notifyall方法时就会唤醒这个线程。
Time_waiting:超时等待状态,当使用sleep方法时就会进入这个状态,当睡眠时间结束之后,线程会再次进入Runnable状态。
Terminated:线程终止状态,当线程运行结束时就会进入终止状态。
线程同步机制:
在多线程编程中,一些敏感数据不允许被多个线程同时访问,此时就使用同步机制,保证数据再任何时候最多有一个线程访问,以保证数据的完整性,会使用到Synchronized锁。
互斥锁:
每一个对象都对应可称为互斥锁标记,这个标记用来保证在任一时候只有一个线程访问该对象,同步方法(非静态)的锁加在对象上,同步方法(静态)的锁加在类上。
线程死锁:
当前有两个线程,相互占有对方所需要的资源,又不放弃已占有的资源造成的问题。
释放锁:
1.代码正常运行至结束。2.同步方法中又break,return。3.在运行代码时报错,或出现异常。4.执行了waite方法,当前线程暂停。