Concurrent.util工具类
CountDownLacth:监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作
CountDownLatch countDown = new CountDownLatch(2);两次
countDown.await()当前线程等待,直到其他线程或当前线程
进行两次countDown.countDown(),则该线程则继续执行
当完成了某种条件才继续执行
CyclicBarrier:当每个线程都准备好才执行(执行自己的线程),只要有一个没有准备好,则全部等待
CyclicBarrier barrier = new CyclicBarrier(3);//程序线程中必须有3次barrier.await()
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(new Thread(...))
executor.submit(new Thread(...))
executor.submit(new Thread(...))
executor.shutdown()
当所有线程都await()时,才全部执行每一个线程
区别:CountDownLach一个线程等待,其他的n个线程发出通知,则等待的线程才执行
CyclicBarrier所有的线程都参与都阻塞,直到所有线程都调用await时,所有线程才继续执行
Future模式:非常适合在处理很耗时很长的业务逻辑时使用,可以有效的减少系统的响应时间,
提高系统的吞吐量
FutureTask<T> future = new FutureTask<T>(new ...())
ExecutorService executor = Executors.newFixedThreadPool(1)
Future f = executor.submit(future)//单独启动一个线程去执行的
这里提交任务future,则开启线程执行RealData的call()方法执行
submit和execute的区别: 第一点是submit可以传入实现Callable接口的实例对象,
第二点是submit方法有返回值
Callable: 类实现Callable(implements Callable<T>)接口,重写call方法
future.get()//调用获取数据方法,如果call()方法没有执行完成,则依然会进行等待
Semaphore: 信号量,非常适合高并发下访问,
PV:page view 网站的总访问量
UV:unique Visitor访问网站的一台电脑客户端为一个访客
QPS: query per second 每秒查询数,
RT:response time 请求访问时间
当然还涉及cpu、内存、网络、磁盘等情况
Semaphore semp = new Semaphore(5)//限制流量策略
semp.acquire() //获取许可 可以有5个线程并行进入执行,6个线程就有一个阻塞
semp.relea se() //释放
高并发解决方式:
1,网络
2,服务(业务,nginx、lvs、haproxy),分流
3,java代码层面(限制流量策略)使用信号量或redis
CountDownLacth:监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作
CountDownLatch countDown = new CountDownLatch(2);两次
countDown.await()当前线程等待,直到其他线程或当前线程
进行两次countDown.countDown(),则该线程则继续执行
当完成了某种条件才继续执行
CyclicBarrier:当每个线程都准备好才执行(执行自己的线程),只要有一个没有准备好,则全部等待
CyclicBarrier barrier = new CyclicBarrier(3);//程序线程中必须有3次barrier.await()
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(new Thread(...))
executor.submit(new Thread(...))
executor.submit(new Thread(...))
executor.shutdown()
当所有线程都await()时,才全部执行每一个线程
区别:CountDownLach一个线程等待,其他的n个线程发出通知,则等待的线程才执行
CyclicBarrier所有的线程都参与都阻塞,直到所有线程都调用await时,所有线程才继续执行
Future模式:非常适合在处理很耗时很长的业务逻辑时使用,可以有效的减少系统的响应时间,
提高系统的吞吐量
FutureTask<T> future = new FutureTask<T>(new ...())
ExecutorService executor = Executors.newFixedThreadPool(1)
Future f = executor.submit(future)//单独启动一个线程去执行的
这里提交任务future,则开启线程执行RealData的call()方法执行
submit和execute的区别: 第一点是submit可以传入实现Callable接口的实例对象,
第二点是submit方法有返回值
Callable: 类实现Callable(implements Callable<T>)接口,重写call方法
future.get()//调用获取数据方法,如果call()方法没有执行完成,则依然会进行等待
Semaphore: 信号量,非常适合高并发下访问,
PV:page view 网站的总访问量
UV:unique Visitor访问网站的一台电脑客户端为一个访客
QPS: query per second 每秒查询数,
RT:response time 请求访问时间
当然还涉及cpu、内存、网络、磁盘等情况
Semaphore semp = new Semaphore(5)//限制流量策略
semp.acquire() //获取许可 可以有5个线程并行进入执行,6个线程就有一个阻塞
semp.relea se() //释放
高并发解决方式:
1,网络
2,服务(业务,nginx、lvs、haproxy),分流
3,java代码层面(限制流量策略)使用信号量或redis