并发及

来源:互联网 发布:qq飞车ce数据 编辑:程序博客网 时间:2024/04/29 03:09

ThreadPoolExecutor构造参数:.corePoolSize:核心线程数,默认核心线程会一直存活, ThreadPoolExecutor。allowCoreThreadTimeOut为true时,闲置的核心线程在keepAliveTime后可被终止;

.maximumPoolSize:最大线程数,当活动线程数达到这个数值后,后续的任务将会被阻塞;
.keepAliveTime:核心线程闲置时(wait状态)的超时时长;
.unit:keepAliveTime时间单位,TimeUnit.MILLISECONDSTimeUnit.SECONDSTimeUnit.MINUTES等;
.workQueue:任务队列,通过线程池的execute方法提交的Runnable对象会存于其中

.threadFactory:创建新线程,接口,newThread(Runnable r); //Callable
.RejectedExecutionHandler:线程池无法执行新任务时,可能是由于任务队列已满或是无法成功执行任务,这时就会调用这个Handler的rejectedExecution方法来反馈,默认rejectedExecution会直接抛出rejectedExecutionException

1.如果线程池中的线程数未达到核心线程的数量,那么会直接启动一个核心线程来执行任务;
2.如果线程池中的线程数量已达到或者超过核心线程的数量,那么任务会被插入到任务队列中排队等待;
3.如果在步骤2中无法将任务插入到的任务队列中,可能是任务队列已满,这时如果线程数量没有达到规定的最大值,那么会立刻启动非核心线程来执行这个任务;
4.如果3中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,ThreadPoolExecutor会调用RejectedExecutionHandlerrejectedExecution方法

shutdown():等所有任务缓存队列中的任务都执行完后才终止,SHUTDOWN,且不接受新任务;shutdownNow(),STOP  Thread.sleep(0)可使OS重配时间片。     volatile poolRunState;


CPU密集型任务,如 NCPU(Runtime.getRuntime().availableProcessors())+1;IO密集型任务,如2*NCPU

.FixedThreadPoolLinkedBlockingQueue,只有核心线程,线程池不主动关闭线程们,经常待命以快速响应请求;
.ScheduledThreadPool:DelayedWorkQueue(DelayQueue. extends AbstractCollection<Runnable>implements BlockingQueue<Runnable>),核心线程数量固定,非核心线程数量没限制,主要用于执行定时或周期性任务;可代Timer.schedule();
.SingleThreadPoolLinkedBlockingQueue,只一个线程,任务们队列化。
如大量数据:Executors.newSingleThreadExecutor().execute(newRunnable(){

    @Override  public void run(){
        db.insert(tableName,null,value);
    }
});

.CachedThreadPool:线程数量不固定,SynchronousQueue<Runnable>,60s的超时机制,立即执行,大量耗时少的任务;


线程结束:run方法执行完;

run() {
       while(true){//持久线程
           work();
           if(shouldFinish){//结束条件
              break;
           }
          /* try {
              Thread.sleep(9999);//周期间隔
           } catch (InterruptedException e) {
              e.printStackTrace();
           }*/
       }
}在while死循环内,每次循环时,察看外部条件。符合条件就break跳出死循环,或抛出异常,跳出死循环;
捕获InterruptedException,中断当前线程:run() {
          while(true){
           try {
             // 阻塞型任务
             //其它thread对象调interrupt() 产生以下异常
           } catch (InterruptedException e) {
              throw new RuntimeException();//或break;结束该线程
           }
           work();

}




//updating

Explicity Lock(显式)  原子变量  局部变量  final  static  同步容器

AbstractQueuedSynchronizer:

ReentrantLock/synchronized:

volatile:并不保证同步,不具有操作的原子性,不适合在对变量的写操作依赖于域本身(如i++、i+=1;), 不适合受到其它域限制

AtomicInteger,轻量级的synchronized,Lock-Free算法。高并发时效率比synchronized高些

浅复制:clone(), System.ArrayCopy()

同步:final Object。wait( Thread.wait()释放线程对锁的拥有权(对象的锁())等到另一线程调用notify(All)()唤醒以便争取锁;确保调用wait()方法的时候拥有锁,须在非抽象synchronized方法或synchronized块中,或Class对象的synchronized、static方法。Thread.sleep() )与notify(唤醒某个等待当前对象的锁的线程/All)(被拥有对象的锁的线程调用)


0 0
原创粉丝点击