Java线程并发库
来源:互联网 发布:淘宝店家寄语 编辑:程序博客网 时间:2024/05/21 07:50
线程池:
//固定线程池,每次最多只能处理5个线程,其余的线程只能在池中等待ExecutorService threadPool1 = Executors.newFixedThreadPool(5);//缓存线程池,可管理的线程时可变的ExecutorService threadPool2 = Executors.newCachedThreadPool();//单个线程池,每次至少只运行一个线程,当里面的线程池中线程死掉死这个池就会再给你创建一个新的ExecutorService threadPool3 = Executors.newSingleThreadExecutor();
其中ExecutorService继承了Executor接口,该接口只定义了一个方法
public interface Executor { /** * Executes the given command at some time in the future. The command * may execute in a new thread, in a pooled thread, or in the calling * thread, at the discretion of the <tt>Executor</tt> implementation. * * @param command the runnable task * @throws RejectedExecutionException if this task cannot be * accepted for execution. * @throws NullPointerException if command is null */ void execute(Runnable command);}
注意里面的参数是一个Runnable对象,所以execute就是表达线程池中的线程所要执行的run方法。一旦传入了这个重写run方法的Runnable对象后,从线程池中获取的线程就会去运行这个run方法
锁
Lock lock = new ReentrantLock();//定义一个锁lock.lock();//上锁lock.unlock();//解锁一般要把unlock放在finally中
读写锁(多个读锁不互斥,写锁与读锁互斥,写锁与写锁互斥)
ReadWriteLock rwl = new ReentrantReadWriteLock();
rwl.readLock().lock();//上读锁
rwl.readLock().unlock();//解读锁
rwl.writeLock().lock();//上写锁
rwl.writeLock().unlock();//解写锁
条件
jdk中的一个实现缓冲区的例子
class BoundedBuffer { final Lock lock = new ReentrantLock();//锁 final Condition notFull = lock.newCondition();//缓冲区没有满时的锁 final Condition notEmpty = lock.newCondition(); //缓冲区没有空时的锁 final Object[] items = new Object[100];//缓冲区可以存放100个Object int putptr, takeptr, count; public void put(Object x) throws InterruptedException { lock.lock();//上锁 try { while (count == items.length) //当缓冲区满时,notFull等待 notFull.await(); items[putptr] = x; if (++putptr == items.length) putptr = 0;//防止数组越界 ++count;//缓冲区数量加1 notEmpty.signal();//当缓冲区放入一个Object时发一个信号量通知notEmpty说可以往缓冲区取数据 } finally { lock.unlock(); } } public Object take() throws InterruptedException { lock.lock();//上锁 try { while (count == 0) //当缓冲区为空时,notEmpty等待 notEmpty.await(); Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0;//防止数组越界 --count;//缓冲区数量减1 notFull.signal();//当缓冲区取走一个Object时发一个信号量通知notFull说可以往缓冲区放数据 return x; } finally { lock.unlock(); } } }
信号量Semaphore (维护了线程的访问数量)
Semaphore sp = new Semaphore(3);//声明了最多只能3个线程同时访问
sp.acquire()//线程获取一个认可,只有获取认可的线程才能往下执行,其余等待获取认可,直到有线程释放了认可(可以由另一个线程释放,不一定是获取认可的本线程)
sp.release()//释放一个认可
计数器CyclicBarrier
CyclicBarrier c = new CyclicBarrier(3);//创建了三个线程的计数器
c.await();//当所有的线程都执行到了await时才可以往下走
倒计时器CyclicDownLatch
CyclicDownLatch中的await方法可以让线程等待,直到另一个线程吧CyclicDownLatch归0
CyclicDownLatch中的countDown方法可以吧CyclicDownLatch归0,这时await的线程就可以放下执行
0 0
- java线程并发库
- java线程并发库
- Java线程并发库
- 【java并发】线程并发库的使用
- java线程并发库总结
- Java线程并发库之线程池
- Java线程通信和线程并发库
- java基础加强6--线程并发库
- java学习笔记之线程并发库
- java修炼线程并发
- Java并发线程
- 六.Java 线程、并发
- java并发:线程安全
- java线程并发
- java线程并发
- Java线程并发控制
- java并发基础--线程
- java并发--线程应用
- 虚拟机下fedora与window共享文件夹
- QT程序打包发布 - 免安装
- Qt编译后无法debug时
- 设计log函数库的几个要点
- QTableView
- Java线程并发库
- 一个有趣的图
- 一 、bochs 环境运行在UBUNTU中搭建
- 设备发现协议
- C++陷阱系列(1):让面试官倒掉的题
- 可编译与不可编译的sigslot
- 一个有趣的问题udhcpc在nfs文件系统无法执行
- linux 无法发送广播封包问题
- C++ GUI Qt 4