美文网首页
线程与线程池总结

线程与线程池总结

作者: 快乐的小2缺 | 来源:发表于2019-11-12 10:08 被阅读0次

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

    相关文章

      网友评论

          本文标题:线程与线程池总结

          本文链接:https://www.haomeiwen.com/subject/imjfictx.html