JAVA 多线程及线程池

  • https://www.liaoxuefeng.com/article/895890199934208
  • 线程是进程中的最小的执行单元,也可理解成一个进程里独立运行的子任务;一个进程可包含多个线程,线程比进程耗费更少资源;进程代表一个应用,操作系统中的一个执行单元;
  • 多线程即一个进程中运行多个具有相同执行逻辑的单元;
  • 并行:多个cpu或多台机器同时执行一段处理逻辑,真正的同时;parellel -> two queues and two coffemacines
  • 并发:通过cpu的调度算法,用户看上去同时,但在cpu的操作层面不是真正的同时,涉及资源共享和阻塞;concurrent -> two queues and one coffemachine;
  • 线程不安全就意味着线程的调度顺序会影响最终结果;如果调度顺序不影响执行结果,则只需要考虑cpu和内存是不是够用;
  • Runnable状态表示线程处在调度的状态(JVM调度),一旦获取CPU资源,就会进入Running状态;
  • Running状态可能由于执行sleep()或join(),变成blocked状态,一旦sleep时间结束,或join中断,则进入Runnable等待调度;
  • Running状态可由于synchronized锁住(进入lock blocked pool),变成lock blocked状态,一旦锁释放,进入Runnable等待调度;
  • Running状态可先由synchronized锁住,然后调用wait(进入wait blocked pool),再调用nofity/nofityAll,线程被放入lock blocked pool,一旦锁释放,进入Runnable等待调度;
  • Running状态也可直接调用yield,进入Runnable状态;
  • http://www.voidcn.com/article/p-rizvqpxu-bam.html
  •  

  • ThreadPoolExecutor继承抽象类AbstractExecutorService,该类实现了两个interface:ExecutorService(子)和Executor(父);
  • 构建ThreadPoolExecutor时,需要如下参数:
    • corePoolSize: 线程池维护线程的最少数量
    • maximumPoolSize:线程池维护线程的最大数量
    • keepAliveTime: 线程池维护线程所允许的空闲时间
    • unit: 线程池维护线程所允许的空闲时间的单位
    • workQueue: 线程池所使用的缓冲队列
    • handler: 线程池对拒绝任务的处理策略
  • 创建线程方式:
    • 如果小于corePoolSize,Executor会添加一个新的线程,而不排队;
    • 如果大于corePoolSize,需通过队列如(SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue)处理请求,而不是添加一个新的线程;
    • 如果也无法排队,则创建一个新的线程,直至maximumPoolSize,最后采用拒绝策略处理;
  • 4种处理策略:

 

posted @ 2018-08-27 12:27  岩文01  阅读(106)  评论(0编辑  收藏  举报