如果开发的线程数据很多,并且每个线程都是执行一个时间很短的任务就结束了。这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。
那么有什么办法可以使的线程多次被复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在java中可以通过线程池来达到这样的效果。
在这里的时候,我们就来补充点知识
java多线程中sleep与wait区别
wait方法:使当前线程暂停执行并释放对象锁标示,让其它线程可以进入到synchronizer方法块中,当前线程被放入对象等待池中。
notify方法:将从对象的等待池中移走一个任意线程并放到锁标示的等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()方法:则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
共同点:
1.他们都是在多线程的环境下,都可以在程序的调用出阻塞指定的毫秒数,并返回。
2.wiat()与sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程抛出InterruptException。
不同点:
1.Thread类的方法:sleep(),yield
Object的方法:wait()和notify()
2.每个对象都有一个锁来控制同步访问,sleep方法不会释放锁,而wait方法会释放锁
3.sleep可以在任何地方使用,而wait,noify,notifyAll只能在synchronized控制方法或者同步控制块里面使用。
使用new Thread 线程弊端
a.每次new Thread 新建对象性能差
b.线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机
c.缺乏过多功能,定时执行,定期执行,线程中断。
相比new Thread,java提供了线程池的好处
a.重用存在的线程,减少对象创建,消亡,性能佳
b.可有效控制最大并发线程数,提高系统资源的使用率,同时可避免过多资源竞争,避免阻塞。
c.提供定时执行,定期执行
java线程池
java通过Executors提供四种线程池,分别是:
1.newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2.newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列里等待。
3.newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
4.newSingleThreadPool创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定的顺序执行。
(1)newCachedThreadPool 创建一个可缓存数据,如果线程长度过程处理需要,可灵活回收空闲线程,如果不能回收,则新建线程
下面是该代码实现
(2)newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超过的线程会在队列里等待。
(3)newScheduledThreadPool创建一个定长线程池,并定期及周期性任务
(4)newSingleThreadPool创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定的顺序执行