线程与线程池总结

2019-11-12  本文已影响0人  快乐的小2缺

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);

上一篇下一篇

猜你喜欢

热点阅读