java 线程池 超过等待_java回顾之线程池、死锁、等待唤醒机制

java回顾之线程池、死锁、等待唤醒机制

一、线程池

1.1线程池的思想

就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源

1.2线程池的好处

1、降低资源消耗

2、提高响应速度

3、提高线程的可管理性

1.3、线程池的使用

创建对象:

Executors的方法:

public static ExecutorService newFixedThreadPool(int nThreads) :返回线程池对象。

(参数表示线程个数最大数量)

ExecutorService的方法:

public Future> submit(Runnable task) :执行一个任务

返回值Future接口:用来记录线程任务执行完毕后产生的结果。

二、死锁

daded4f72ed1319f0a696ee3bb29828f.png

在多个线程执行中,如果有多个锁,线程获取到了部分的锁,不释放手中的锁,一直等待剩余的其他锁,导致线程互相进入等待状态,造成每个线程都无法执行。

synchronized("字符")  synchronized锁里面的对象如果相同的话,即使不在一个类里,也是同一个锁

569cfaaeeed84578db49ea321ebeef3b.png

96417d4037a9f94f74f1d341b4f14197.png

11b8000edd22e098e47638ef71f8c267.png

如上图所示,一共有两个锁,两个线程,每个线程只有拿到两个锁,才可以完成全部,当一号拿到左筷子时,二号拿了右筷子,这样就成了死锁,线程都出不来

32cd893aa78cc029356d4b45f0ade782.png

三、线程状态

NEW : 新建状态。 创建出线程对象时

Runnable:可运行状态。调用了start()方法时

Blocked :锁阻塞状态。在等待锁的时

Waiting :无限等待状态。 在调用wait()时

Timed Waiting :计时等待状态。 在调用sleep(long times)时

Terminated:被终止状态。在run()方法执行结束时

新建、运行、锁阻塞、等待、睡眠、终止。

95818d906b4c7f2cfce6510e2b796c9a.png

8c04cbb16d31b4405e07bdadb255eb4a.png

四、等待唤醒机制

Object类的方法

wait()          让当前线程进入等待状态

notify()    唤醒一个正在等待的进程

这两个方法必须使用锁对象调用

两个方法的注意事项

两个方法为什么要定义在Object类中

因为方法需要锁对象来调用,锁对象可以是任何类型,为了避免转型,所以定义在Object类中

两个方法必须卸载同步里面吗?

在同步里面才有锁这个概念,在同步外面对象已经失去了锁的概念

wait()等待和sleep()睡眠的区别

0151757bb175b43497f3818cefff45ba.png

等待会释放锁,等待别的线程过来!!!!!

如果有交替进行的需求,可以定义一个flag每个线程走完改一下值,flag=1是一个线程执行,flag=2另一个线程执行

六、定时器

构造方法:

public Timer():构造一个定时器

常用方法:

void schedule(TimerTask task, long delay)

//在指定的延迟之后安排指定的任务执行。

void schedule(TimerTask task, long delay, long period)

//在指定 的延迟之后开始,重新执行固定延迟执行的指定任务。

void schedule(TimerTask task, Date time)

//在指定的时间安排指定的任务执行。

void schedule(TimerTask task, Date firstTime, long period)

//从指定的时间开始,对指定的任务执行重复 的 固定延迟执行 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值