目录
简单的线程介绍
进程:把进程比喻成一个工厂的厂房。
线程:把比喻成流水线。
任务就是在流水线上面需要做的工作
并发和并行
并发:在一个时间段里面有多个线程在运行,要注意是交互运行不是同时运行。
并行:在同一个时刻有多个线程在运行。
创建线程三种方法
1、继承Thread类:
重写run()方法,为单继承
2、实现Runnable接口(常用):
重写run()方法,可以实现多个接口,实现资源共享
3、实现Callable接口:
配合FutureTask类,可以有返回值。
几个常用API:
Thread currentThread()
返回当前线程
getName()
获得线程的名称
setPriority(int priority)
设置线程的优先级
run()
是一个普通方法不能启动线程
start()
会开辟一个新的栈空间,让当前栈属于就绪状态抢到时间片之后分配栈空间开始执行。
sleep():
让线程进入睡眠阻塞状态,时间到之后自动唤醒变为就绪状态。
yieid():
线程礼让,暂停当前线程的执行,让出时间片,回到就绪状态wait()和 sleep()的区别:
wait():
是Object类中的方法,用在同步锁的代码中,线程等待(挂起,阻塞)释放锁,要手动才能唤醒。
join():
等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态
线程的五个状态:
1、新建状态
2、就绪状态:线程抢到时间片之后
3、运行状态
4、阻塞状态
5、死亡状态
线程同步
线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。
可以解决线程同步数据安全的问题。但是比较耗费资源,降低了效率。
用synchornized和lock实现同步
synchronized关键字:
同步代码块,同步实例方法,同步静态方法,自动解锁,jdk1.6在之后对synchronized进行了优化,性能得到了提升。用法:同步代码块,同步实例方法,同步静态方法
Lock:接口,提供的有各种实现类,手动的加锁和解锁,使用try和finally,性能更好,灵活性更高
死锁
当多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,从而导致两个或者多个线程都在等待对方释放资源,都停止执行的情况。
线程池
多线程运行时,系统不断创建和销毁新的线程,成本非常高,会过度的消耗系统资源,从而可能导致系统资源崩溃,使用线程池就是最好的选择
ThreadPoolExecutor pool1 = new ThreadPoolExecutor(1、2、3、4、5、6、7)
1:核心线程数
2:最大线程数:一般和核心线程数一致
3:闲置线程的存活时间:数字
4:时间单位
5:任务队列:阻塞队列
6:线程工厂:创建新线程的方式,使用默认工厂
7:拒绝策略:默认,抛出异常