一.线程的开启
1.继承 Thread
2.接口 Runable
3.接口 Callable
4.使用匿名内部类创建
二.进程的分类
1.守护进程
2.非守护进程
三.常用API
1.sleep() 休眠一定时间
2.join() 表示一旦某个线程调用了join方法,那么就要一直运行到该线程运行结束,才会运行其他进程
3.Sychronization
一.同步代码块 锁对象可以是任意的对象
二.普通同步方法 锁对象默认是是 this
三.静态同步方法 锁对象是当前类的class对象
4.wait()使调用该方法的线程释放共享资源锁,然后从运行状态退出,进入等待队列,直到被再次唤醒
5.notify() 随机唤醒等待队列中等待同一共享资源的 “一个线程”,并使该线程退出等待队列,进入可运行状态,也就是notify()方法仅通知“一个线程”
6.volatile 是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。但volatile无法保证线程的安全性。
7.Atomic原子类
8.ThreadLocal
四.线程的五种状态
- 新建(NEW):新创建了一个线程对象。
- 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
- 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
- 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。
- 死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
五.并发编程中的三个概念
1.原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。(一个很经典的例子就是银行账户转账)
2.可见性:是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
3.有序性:即程序执行的顺序按照代码的先后顺序执行。举个简单的例子,看下面这段代码。