线程基础、线程之间的共享和协作
线程基础
进程和线程
- 进程:程序运行资源分配的最小单位,进程内部有多个线程,会共享这个进程的资源
- 线程:CPU调度的最小单位,必须依赖进程而存在。
高并发编程的意义、好处和注意事项
- 好处:充分利用cpu的资源、加快用户响应的时间,程序模块化,异步化
- 问题:
- 线程共享资源,存在冲突;
- 容易导致死锁;
- 启用太多的线程,就有搞垮机器的可能
线程实现三种方式
- 继承Thread
1 | /** |
- 实现Runnable 无返回值
1 | /** |
- 实现Callable 又返回值
1 | /** |
1 | //运行 |
线程停止
stop(),resume(),suspend() 不建议使用了 容易造成死锁 可以使用interrupt()对线程加上中断标志 如下:
interrupt() 将线程中断标志位置为true
isInterrupted() 判定当前线程是否处于中断状态。
interrupted() 判定当前线程是否处于中断状态,同时中断标志位改为false。
方法里如果抛出InterruptedException,线程的中断标志位会被复位成false,如果确实是需要中断线程,要求我们自己在catch语句块里再次调用interrupt()。
线程状态

run()和start():run方法就是普通对象的普通方法,只有调用了start()后,Java才会将线程对象和操作系统中实际的线程进行映射,再来执行run方法。
yield():把CPU时间让出来,让其他或者自己的线程执行(也就是谁先抢到谁执行)
wait():线程会释放锁,进入阻塞状态
notify/notifyAll():在获取锁的状态下,唤醒wait()的线程
join():用来插队,线程A,执行了线程B的join方法,线程A必须要等待B执行完成了以后,线程A才能继续自己的工作
应该尽量使用notifyAll,使用notify 只会唤醒一个 有可能发生信号丢失的的情况
1 | yield() 、sleep()、wait()、notify()的区别: |
线程间的共享
- synchronized内置锁
- volatile关键字 一个写 多个读的情况
- ThreadLocal 线程变量
1
2
3
4
5
6
7//可以理解为 一个map,类型 Map<Thread,Integer>
static ThreadLocal<Integer> threadLaocl = new ThreadLocal<Integer>(){
protected Integer initialValue() {
return 1;
}
};