摘要:的多任务执行框架提供了一套线程框架来帮助开发者有效的进行线程控制,扮演线程工厂的角色,其创建线程的方法如下返回固定数量的线程池,该方法的线程数始终不变。
1.Jdk的多任务执行框架
JDK提供了一套线程框架Executor来帮助开发者有效的进行线程控制,Executors扮演线程工厂的角色,其创建线程的方法如下
newFixedThreadPool() 返回固定数量的线程池,该方法的线程数始终不变。若线程空闲则立即执行 否则暂缓到队列中
newSingleThreadPool() 创建一个线程池,若线程空闲则立即执行 否则暂缓到队列中
newCachedThreadPool() 返回一个可根据实际情况调整线程个数的线程池 ,若线程空闲则立即执行 否则暂缓到队列中
newScheduledThreadPool() 返回一个ScheduledExecutorService对象,但该线程可以执行线程的数量(schedule 排定/安排/目录)
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10); //command 就是一个Thread ScheduledFuture> scheduledTask = scheduler.scheduleWithFixedDelay(command,5,1, TimeUnit.SECONDS);
若Executors工厂类无法满足我们的需求,可以自己去创建自定义的线程池。自定义线程池的构造方法如下
public ThreadPoolExecutor(int corePoolSize,//核心线程数 int maximumPoolSize,//最大线程数 long keepAliveTime,//线程的空闲时间 TimeUnit unit,//给定单元粒度的时间段 BlockingQueueworkQueue,//有界、无界队列 RejectedExecutoionHandler handler//任务拒绝策略 ){.....}
使用什么队列对该构造方法来说比较关键
使用有界队列 如有任务需要执行 如果实际线程数 使用无界队列LinkedBlockingQueue 除非系统资源耗尽 否则不会出现入队失败 JDK的拒绝策略 AbortPolicy:直接抛出异常 系统正常工作 CallerRunsPolicy:只要线程池未被关闭 尝试运行被丢弃的任务 DiscardOldestPolicy:丢失最老的请求 尝试提交当前任务 DiscardPolicy:丢弃无法处理的任务不给予处理 JDK提供的拒绝策略不友好,可以自定义拒绝策略,实现RejectedExecutionHandler接口(添加日志等等) 2.Concurrent.util工具类详解 CyclicBarrier CountDownLatch Callable 和Future使用 Semaphore信号量 3.锁的高级深化 Lock and Condition 使用Lock对象也可以实现同步互斥 如果多个线程之间需要实现协作 使用Object的wait和nofity,notifyAll 在使用Lock的时候可以使用一个新的等待/通知的类Condition 只针对一个具体的锁 ReentrantLock重入锁 ReentrantReadWriteLock读写锁 锁的优化 避免死锁 减少锁的持有时间 减少锁的粒度 锁的分离 尽量使用无锁的操作 比如原子类操作 如果实际线程数>corePoolSize,则将任务添加到缓存队列
如果缓存队列已满 ,总线程
如有任务需要执行 如果实际线程数
BlockingQueue
public class MyRejected implements RejectedExecutionHandler {
public MyRejected(){}
@Override
public void rejectedExecution(Runnable r,
ThreadPoolExecutor executor) {
System.out.println("自定义处理");
System.out.println("当前被拒绝的任务为"+r.toString());
}
}
假设每一个线程代表一个运动员,当运动员都准备好了,才能一起出发。CyclicBarrier barrier = new CyclicBarrier(3);
经常用于监听某些初始化操作,当初始化执行完毕以后,通知主线程继续工作final CountDownLatch countDownLatch = new CountDownLatch(2);
Futrue模式费用适合在处理耗时很长的业务逻辑进行使用,可以有效的减小系统的影响,
提高系统的吞吐量 public class UseFuture implements Callable
可以控制系统的流量,拿到线程的信号量则访问否则等待
通过acquire和release来获取和释放线程 final Semaphore semp = new Semaphore(5);
使用synchronized关键字可以实现线程间的同步互斥工作 public class UseCondition {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void method1(){
try {
lock.lock();
System.out.println("当前线程:" +
Thread.currentThread().getName() + "进入等待状态..");
Thread.sleep(3000);
System.out.println("当前线程:" +
Thread.currentThread().getName() + "释放锁..");
condition.await(); // Object wait
System.out.println("当前线程:" +
Thread.currentThread().getName() +"继续执行...");
condition.signal(); //Object notify
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
private Lock lock = new ReentrantLock(boolean isFair);//是否为公平锁
核心是实现读写分离 在都多写少的情况下 性能高于重入锁public class UseReentrantReadWriteLock {
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private ReadLock readLock = rwLock.readLock();
private WriteLock writeLock = rwLock.writeLock();
public void read(){
try {
readLock.lock();
System.out.println("当前线程:" +
Thread.currentThread().getName() + "进入...");
Thread.sleep(3000);
System.out.println("当前线程:" +
Thread.currentThread().getName() + "退出...");
} catch (Exception e) {
e.printStackTrace();
} finally {
readLock.unlock();
}
}
public void write(){
try {
writeLock.lock();
System.out.println("当前线程:" +
Thread.currentThread().getName() + "进入...");
Thread.sleep(3000);
System.out.println("当前线程:" +
Thread.currentThread().getName() + "退出...");
} catch (Exception e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
}
}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70552.html
摘要:今天给大家总结一下,面试中出镜率很高的几个多线程面试题,希望对大家学习和面试都能有所帮助。指令重排在单线程环境下不会出先问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。使用可以禁止的指令重排,保证在多线程环境下也能正常运行。 下面最近发的一些并发编程的文章汇总,通过阅读这些文章大家再看大厂面试中的并发编程问题就没有那么头疼了。今天给大家总结一下,面试中出镜率很高的几个多线...
摘要:如问到是否使用某框架,实际是是问该框架的使用场景,有什么特点,和同类可框架对比一系列的问题。这两个方向的区分点在于工作方向的侧重点不同。 [TOC] 这是一份来自哔哩哔哩的Java面试Java面试 32个核心必考点完全解析(完) 课程预习 1.1 课程内容分为三个模块 基础模块: 技术岗位与面试 计算机基础 JVM原理 多线程 设计模式 数据结构与算法 应用模块: 常用工具集 ...
阅读 987·2021-11-24 10:30
阅读 2315·2021-10-08 10:04
阅读 3948·2021-09-30 09:47
阅读 1432·2021-09-29 09:45
阅读 1434·2021-09-24 10:33
阅读 6234·2021-09-22 15:57
阅读 2350·2021-09-22 15:50
阅读 4078·2021-08-30 09:45