1.线程间的通信
(1)前提,必须要有同步监视器,即synchronized关键字修饰代码块或方法
wait()导致当前线程等待
notify()唤醒在此同步监视器上等待的单个线程
notifyAll()唤醒唤醒在此同步监视器上等待的全部线程
(2)Lock代替同步方法或同步代码块,Condition代替了同步监视器的功能
await()导致当前线程等待
singal()唤醒在此同步监视器上等待的单个线程
singalAll()唤醒唤醒在此同步监视器上等待的全部线程
private final Lock lock = new ReentrantLock();
private final Condition cond = lock.newCondition();
.....
lock.lock();
try{
......
cond.await();
......
cond.singalAll();
.......
finally{
lock.unlock();
}
(3)使用阻塞队列(BlockingQueue)控制线程通信
如果BlockingQueue队列已满或已空,则线程进入阻塞状态
put(E e):把E元素放入BlockingQueue中尾部(支持阻塞)
add(E e):把E元素放入BlockingQueue中尾部
offer(E e):把E元素放入BlockingQueue中尾部
take():从BlockingQueue头部取出元素(支持阻塞)
remove(E e):从BlockingQueue头部取出元素
poll(E e):从BlockingQueue头部取出元素
element():在队列头部取出但不删除元素,当队列为空,抛出异常
peek():在队列头部取出但不删除元素,当队列为空,抛出异常
2.线程分组
Thread(ThreadGroup group,Runnable target):以target的run()方法作为线程执行体创建新线程
Thread(ThreadGroup group,Runnable target,String name): 以target的run()方法作为线程执行体创建新线程, 该线程属于Group线程组,且线程名为name
Thread(ThreadGroup group,String name):创建新线程,新线程名为name,属于group组
ThreadGroup(String name):以指定的线程组名字来创建新线程组
ThreadGroup(ThreadGroup parent,String name): 以指定的名字,指定的父线程组来创建一个新线程组
setThreadGroup(): 改变线程所属的组
getThreadGroup(): 获取线程所属的组
一旦创建了线程组,不允许改变线程组的名字。可以通过getName()获取名字
操作线程组里的线程
int activeCount():返回此线程组中活动线程的数目
interrupt():中断此线程组中所有线程
isDaemon():判断该线程组是否是后台线程组
setDaemon(boolean daemon):把该线程组设置为后台线程组
setMaxPriority(int pri):设置线程组的优先级
线程组内在发生异常是,JVM会首先查找该异常对应的异常处理器,来处理异常
否则,调用该线程组所属的线程对象的uncaughtException()方法处理异常
可以通过[static] setDefaultUncaughtException(Thread.UncaughtExceptionHandler en)设置默认线程组为默认 的异常处理器
3.线程池
http://zhangjunhd.blog.51cto.com/113473/70068/
Executors类
ForkJoinPool
ThreadLocal类