多线程精华,面试专用
来源:互联网 发布:eplan软件界面 编辑:程序博客网 时间:2024/04/27 00:43
注意:部分代码为伪代码,注意虚假唤醒和死锁,对于同步快,使用同步集合类!!!
一,定义线程的方式
a,extends Thread
b,implements Runnable
二,产生线程的方法
a,new Thread().start();
b, Executors.newFixedThreadPool(10).execute(new Runnable(){...});
c, Executors.newCachedThreadPool().execute(new Runnable(){...});
d, Executors.newScheduledThreadPool(10).schedule(new Runnable(){...})
e, Executors.newSingleThreadExecutor(10).execute(new Runnable(){...})//可替补单线程
三,实现同步的方式
a,synchronized 关键字
b, new Semaphore(1); //信号灯还可以控制并发数量,
c, Lock lock = new ReentrantLock();
d, ReadWriteLock lock = new ReentrantLock();
注意:1,高并发时,防止重入,应循环检查当前状态
2, 在写锁释放前lock读锁,会将写锁降级为读写锁
3, 无论如何,最终需要释放锁
四,线程间通信的方式
a,this.wait(); this.notify()/this.notifyAll()
b, new BlockingQueue(1),new BlockingQueue(1);
//可使用阻塞队列来实现,因为其put(...)和take()均为阻塞方法
c, condition1 = new ReentrantLock().new Condition();
condition2 = new ReentrantLock().new Condition();
condition1.await(); ..执行过程.... condition2.signal();
五,线程内数据共享:
ThreadLocal<ThreadScopeSharedData> map = new ThreadLocal<ThreadScopeSharedData>();
建议:本地线程结合单例模式使用
五,应用场景
a,去东莞交友模式:
创建10个钢铁战士
召唤集合石: CyclicBarrier barrier = new CyclicBarrier(len);
集合: barrier.await();
解散:barrier.reset();
抵达东莞,会长喊话,给每个战士们,分配任务,最后统计成绩
CountDownLatch od = new CountDownLatch(1);
CountDownLatch ob = new CountDownLatch(n);
od.countDown();//让战士们自由发挥
ob.await();//等待战士们凯旋
new Runnable(){
void run(){
od.await();//会长分配任务细节
//任务细节:偷菜
CompletionService<Integer> service = new ExecutorCompletionService<Integer>(pool);
播种:serice.submit(new CallAble(){....});
收获:serice.take();
ob.countDown();//每一个战士完成任务时,调用一次(此代码需要调用10次)
}
}
拓展:因网吧电脑数量有限,执行任务前可采用信号灯来控制战士们同时上机的数量
b,数据交换
Exchanger<Object> exchanger = new Exchanger<Object>();
线程一细节:
Object resultOne =exchanger.exchange(毛毛);
线程二细节:
Object resultTwo =exchanger.exchange(卡素);
执行结果,毛毛和卡素完成了被交换 ^ o ^
c,定时器
略~~
一,定义线程的方式
a,extends Thread
b,implements Runnable
二,产生线程的方法
a,new Thread().start();
b, Executors.newFixedThreadPool(10).execute(new Runnable(){...});
c, Executors.newCachedThreadPool().execute(new Runnable(){...});
d, Executors.newScheduledThreadPool(10).schedule(new Runnable(){...})
e, Executors.newSingleThreadExecutor(10).execute(new Runnable(){...})//可替补单线程
三,实现同步的方式
a,synchronized 关键字
b, new Semaphore(1); //信号灯还可以控制并发数量,
c, Lock lock = new ReentrantLock();
d, ReadWriteLock lock = new ReentrantLock();
注意:1,高并发时,防止重入,应循环检查当前状态
2, 在写锁释放前lock读锁,会将写锁降级为读写锁
3, 无论如何,最终需要释放锁
四,线程间通信的方式
a,this.wait(); this.notify()/this.notifyAll()
b, new BlockingQueue(1),new BlockingQueue(1);
//可使用阻塞队列来实现,因为其put(...)和take()均为阻塞方法
c, condition1 = new ReentrantLock().new Condition();
condition2 = new ReentrantLock().new Condition();
condition1.await(); ..执行过程.... condition2.signal();
五,线程内数据共享:
ThreadLocal<ThreadScopeSharedData> map = new ThreadLocal<ThreadScopeSharedData>();
建议:本地线程结合单例模式使用
五,应用场景
a,去东莞交友模式:
创建10个钢铁战士
召唤集合石: CyclicBarrier barrier = new CyclicBarrier(len);
集合: barrier.await();
解散:barrier.reset();
抵达东莞,会长喊话,给每个战士们,分配任务,最后统计成绩
CountDownLatch od = new CountDownLatch(1);
CountDownLatch ob = new CountDownLatch(n);
od.countDown();//让战士们自由发挥
ob.await();//等待战士们凯旋
new Runnable(){
void run(){
od.await();//会长分配任务细节
//任务细节:偷菜
CompletionService<Integer> service = new ExecutorCompletionService<Integer>(pool);
播种:serice.submit(new CallAble(){....});
收获:serice.take();
ob.countDown();//每一个战士完成任务时,调用一次(此代码需要调用10次)
}
}
拓展:因网吧电脑数量有限,执行任务前可采用信号灯来控制战士们同时上机的数量
b,数据交换
Exchanger<Object> exchanger = new Exchanger<Object>();
线程一细节:
Object resultOne =exchanger.exchange(毛毛);
线程二细节:
Object resultTwo =exchanger.exchange(卡素);
执行结果,毛毛和卡素完成了被交换 ^ o ^
c,定时器
略~~
0 0
- 多线程精华,面试专用
- .net面试精华
- Android面试精华
- ssh面试精华
- android面试精华转载
- Android面试精华
- Android面试精华题目
- Java面试精华
- 多线程精华集萃
- Spring 核心思想(面试专用)
- C语言面试专用题库
- 2013 Android面试精华总结
- 2013 Android面试精华总结
- Android 面试精华题目总结
- Android 面试精华题目总结
- Android 面试精华题目总结
- Android 面试精华题目总结
- Android 面试精华题目总结
- 企业级Hadoop能够解决的问题
- 一起学Maven(Maven仓库管理器之应用Nexus)<六>
- poj 2488:A Knight's Journey
- linux 列出两个文件的差异行
- linux内核cdev_init系列函数(字符设备的注册)
- 多线程精华,面试专用
- 【C#】简易网页计算器实现
- 统计大于均值的数字个数
- MySQL优化 之 Discuz论坛MySQL通用优化
- DataGridView二维表头与合并单元格
- Android R文件丢失解决办法
- python微信五数据库
- java线程池
- 编译inkscape