线程与线程池总结
1) 线程的几种状态
· 初始状态:new Thread 进入初始状态
·可运行状态(就绪状态):调用线程的start方法,进入可运行状态
· 运行状态:OS选中,此进程获得cpu的时间片,该线程开始执行run方法,进入运行状态
· 阻塞状态:调用Thread.sleep方法(sleep结束进入就绪状态)、调用其他线程的join方法(其他线程执行结束进入就绪状态)、等待用户输入(用户输入完,进入就绪状态)等进入阻塞状态
· 死亡状态:run方法执行结束,进入死亡状态
图片来自网络另外,线程执行过程中:
1、遇到同步锁Synchronized时,进入锁池队列;
2、调用wait方法,该进程进去等待序列,等待其他进程调用notify或者notifyAll唤醒
3、锁池队列的线程拿到对象锁时,线程进入就绪状态
4、调用Thread.yield()方法,让出cpu资源,进入就绪状态与其他线程一起竞争资源
2) 线程相关的几个方法
线程的方法:
Thread.sleep(long milSecond);静态方法,调用肯定是当前线程执行
Thread.yield(); 静态方法,调用肯定是当前线程执行
t.join()或者t.join(long milSecond); 成员方法,将cpu资源让给t,t执行完毕或者执行到milSecond时,进入就绪状态
对象方法:
obj.wait(); 调用线程进入等待队列
obj.notify(); 唤醒等待队列中监听该对象的某个线程进入锁池队列
obj.notifyAll(); 唤醒等待队列中监听该对象的所有线程进入锁池队列
3) 四种常用线程池:
ExecutorService是Java提供的用于管理线程池的类。该类的两个作用:控制线程数量和重用线程
·Executors.newCacheThreadPool():
可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务
·Executors.newSingleThreadExecutor():
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
·Executors.newFixedThreadPool(int n):
创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程。
·Executors.newScheduledThreadPool(int n):
创建一个定长线程池,支持定时及周期性任务执行
ScheduledExecutorService scheduledExecutorService=Executors.newScheduledThreadPool(10);
延迟三秒执行:
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
}
},3,TimeUnit.SECONDS);
60秒后开始任务,每执行完一个任务后10秒开始下个任务:
scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
}
},60,10,TimeUnit.SECONDS);
60秒后开始任务,每隔10秒开始一个任务:
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
}
},60,10,TimeUnit.SECONDS);