Chinaunix首页 | 论坛 | 博客
  • 博客访问: 283581
  • 博文数量: 58
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-27 08:37
个人简介

从linux了解世界

文章分类
文章存档

2017年(5)

2016年(51)

2015年(2)

我的朋友

分类: Java

2016-08-08 20:18:21

reentrantlock的使用样例:
    private final ReentrantLock lock = new ReentrantLock();
    private final Condition contion1=lock.newCondition();
    private final Condition contion2=lock.newCondition();
    public void m() {
        lock.lock(); // block until condition holds
        try {
            contion2.signalAll();
            contion1.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
reentrantlock可以有多个条件,condition类的await和signal对应object类的wait和notify。

线程池的使用:
1、创建线程池
可以使用executors类来创建不同的线程池,所有方法都是静态的,创造出的线程池。
Single Thread Executor : 只有一个线程的线程池,因此所有提交的任务是顺序执行,代码: Executors.newSingleThreadExecutor()
Cached Thread Pool : 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,如果线程超过60秒内没执行,那么将被终止并从池中删除,代码:Executors.newCachedThreadPool()
Fixed Thread Pool : 拥有固定线程数的线程池,如果没有任务执行,那么线程会一直等待,代码: Executors.newFixedThreadPool()
Scheduled Thread Pool : 用来调度即将执行的任务的线程池,代码:Executors.newScheduledThreadPool()
Single Thread Scheduled Pool : 只有一个线程,用来调度执行将来的任务,代码:Executors.newSingleThreadScheduledExecutor()

也可以直接new线程池,ThreadPoolExecutor是最常用的
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler)
其中workqueue是用来存放任务的阻塞队列,可以使用:
arrayblockingqueue:基于数组的有界阻塞队列,fifo对元素排序
linkedblockingqueue:Executors.newFixedThreadPool()使用了这个队列
synchronousqueue:不存储元素的阻塞队列,每个插入操作必须等待另一个线程调用擦除方法,否则一直阻塞,吞度量高于linkedblockingqueue。Executors.newCachedThreadPool()使用了这个队列
priorityblockingqueue:具有优先级的无限阻塞队列
handler是当队列和线程池都满了时处理新提交任务的策略,默认是abortpolicy,表示无法处理时抛出异常,threadpoolexecuoer中有四个内部类代表这种策略:
ThreadPoolExecutor.AbortPolicy直接抛出异常
ThreadPoolExecutor.CallerRunsPolicy只用调用者所在线程执行任务
ThreadPoolExecutor.DiscardOldestPolicy丢掉队列中最近一个任务,并执行当前任务
ThreadPoolExecutor.DiscardPolicy不处理,丢弃任务
2、提交任务,也就是提交runnable实现类对象。所有线程池都实现了executor和executorservice接口,都可以通过execute或者submit方法提交任务到任务队列中。但是execute方法提交之后无法知道任务的执行状态,submit方法提交后会返回一个future的对象,可以查看任务执行状态。
3、关闭线程池,executorservice接口中的shutdown和shutdownnow方法可以关闭线程池。
原理是:遍历线程池中的工作线程,逐个调用线程的interrupt方法来中断任务(如果任务无法响应中断可能永远无法终止)。shutdown把线程池状态设为shutdown,中断没有正在执行的线程,shutdownnow把线程池状态设为stop,中断正在执行和等待执行的线程。两种方法调用后ishutdown都是true,所有进程都关闭后isterminated才是true。

原子类的使用:
一般都有两个构造方法,一个初始化为默认值,一个初始化为给定值。
所有方法都是原子操作。加、减、自加、自减和赋值操作。


阅读(2112) | 评论(0) | 转发(0) |
0

上一篇:java常用同步机制

下一篇:jvm调优总结

给主人留下些什么吧!~~