多线程

 线程池 分配   threads= cores/1-blockingCoefficient。

                   corePoolSize = Cpu 数 +1  (计算性密集型的操作)

      cpu执行时间:a

      等待时间:b

      线程数取值: k*核心数*(a+b)/a

    k超线程 1.5 或者 2  ,a,b的值由压测得出

    线程队列取值 :核心数 * 容忍的等待时间 * (a+1.5b)/(a+b)

  -Xss (默认 1M) ,如果有很多递归操作 可以增加 5M ,10M ,同时考虑 内存 的大小

  请求来了,当核心线程数 满了, 先进入队列,等队列满了之后再创建到最大线程数

 

Semaphore

 LinkedBlockingQueue 无界队列

SynchronousQueue  直接提交,如果超过最大线程数,再来线程给你的主线程 ,谁创建你就给谁,给父线程

! ArryayBlockingQuene 有界队列 , 一般用这个

最大线程数满了,执行策略:

AbortPolicy :直接抛出异常 

CallerRunspolicy:重试添加当前的任务,他会自动重复调用execute()方法

DiscardOldestPolicy:放弃 最旧的来处理请求,执行新传入的任务

DiscardPolicy:不做任何操作,放弃

BlockingQueue  提倡的办法

 

Executor

实例  多线程 发送邮件,发送完成 主线程 监控 

线程池的选择

CountDownLatch  

 latch.countDown()

 

ThreadLocal

InheritableThreadLocal

 

并发编程注意事项

1.线程名称设置

2.Atomic+ Atomic  !=Atomic  2个原子操作相加不是原子操作

3.响应中断InterruptedException

 

相关概念

1.java并发性和多线程就介绍

2.深入理解java内存模型

3.同步和java内存模型

4.happens-before俗称

网站:并发编程网

书籍:java并发编程实践

posted @ 2015-03-18 17:05  隔壁的老郭  阅读(76)  评论(0)    收藏  举报