多线程
文章平均质量分 77
kfengqingyangk
这个作者很懒,什么都没留下…
展开
-
1.创建多线程的两种方式
1.在Thread子类覆盖的run方法中编写运行代码Thread t1 = new Thread(){ public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.原创 2017-03-21 20:49:33 · 322 阅读 · 0 评论 -
15.线程面试题三
现有程序同时启动了4个线程去调用TestDo.doSome(key, value)方法,由于TestDo.doSome(key, value)方法内的代码是先暂停1秒,然后再输出以秒为单位的当前时间值,所以,会打印出4个相同的时间值,如下所示:4:4:12581996151:1:12581996153:3:12581996151:2:1258199615 请修改代原创 2017-04-03 21:34:05 · 261 阅读 · 0 评论 -
8.Lock&Condition实现线程同步通信
一、Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Lo原创 2017-04-03 15:06:44 · 198 阅读 · 0 评论 -
11.可阻塞的队列
①队列包含固定长度的队列和不固定长度的队列②什么是可阻塞队列,阻塞队列的作用与实际应用,阻塞队列的实现原理。阻塞队列是一个在队列基础上又支持了两个附加操作的队列。2个附加操作:支持阻塞的插入方法:队列满时,队列会阻塞插入元素的线程,直到队列不满。支持阻塞的移除方法:队列空时,获取元素的线程会等待队列变为非空。class BoundedBuffer { fi原创 2017-04-03 17:01:01 · 298 阅读 · 0 评论 -
16.volatile关键字 内存可见性
一、内存可见性①内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。②可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。③我们可以通过同步来保证对象被安全地发布。除此之外我们也原创 2017-04-04 09:57:48 · 682 阅读 · 0 评论 -
17.原子变量 CAS算法
案例引入:public class TestAtomicDemo { public static void main(String[] args) { AutomicDemo ad = new AutomicDemo(); for(int i = 0; i<10;i++){ new Thread(ad).start(); } }}class AutomicDemo i原创 2017-04-04 10:59:57 · 347 阅读 · 0 评论 -
18.模拟 CAS 算法
public class TestCompareAndSwap { public static void main(String[] args) { final CompareAndSwap cas = new CompareAndSwap(); for(int i = 0;i<10;i++){ new Thread(new Runnable() { public void原创 2017-04-04 11:20:04 · 426 阅读 · 0 评论 -
19.ConcurrentHashMap
首先hashMap和hashTable的简单比较①Java5.0在Java.util.concurrent包中提供了多种并发容器类来改进同步容器的性能。②ConcurrentHashMap同步容器时Java5增加的一个线程安全的哈希表。对与多线程的操作,介于HashMap和HashTable之间。内部采用“锁分段”机制替代Hashtable的独占锁,进而提高性能③此包还原创 2017-04-04 15:39:43 · 298 阅读 · 0 评论 -
20.CountDownLatch闭锁
①Java5.0在java.util.concurrent包中提供了多种并发容器类来改进同步容器的性能。②CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。③闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行:---> 确保某个计算在其需要的所有资源都被初始化之后才继续执行;原创 2017-04-04 16:13:12 · 239 阅读 · 0 评论 -
23.生产者消费者案例-虚假唤醒
普通的生产者消费者案例生产者线程:添加和创建数据的线程消费者线程:删除和销毁数据的线程public class TestProductAndConsumer { public static void main(String[] args) { Clerk clerk = new Clerk(); Productor productor = new Productor(cl原创 2017-04-05 22:05:30 · 357 阅读 · 0 评论 -
24.Condition
①Condition接口描述了可能会与锁有关联的条件变量。这些变量在用法上与使用Object.wait访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个Lock可能与多个Condition对象关联。为了避免兼容性问题,Condition方法的名称与对应的Object版本中的不同②在Condition对象中,与wait()、notify()、notifyAll()方法对应的分别是原创 2017-04-05 22:21:00 · 234 阅读 · 0 评论 -
25.线程面试题四 --- 14K起步题
编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。 如:ABCABCABC…… 依次递归代码:import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java原创 2017-04-06 09:03:29 · 355 阅读 · 0 评论 -
26.读-写锁 ReadWriteLock
①ReadWriteLock维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有writer,读取锁可以多个reader线程同时保持,写入锁是独占的。②ReadWriterLock读取操作通常不会改变共享资源的,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全原创 2017-04-06 12:35:36 · 316 阅读 · 0 评论 -
14.线程面试题二
现成程序中的Test类中的代码在不断地产生数据,然后交给TestDo.doSome()方法去处理,就好像生产者在不断地产生数据,消费者在不断消费数据。请将程序改造成有10个线程来消费生成者产生的数据,这些消费者都调用TestDo.doSome()方法去进行处理,故每个消费者都需要一秒才能处理完,程序应保证这些消费者线程依次有序地消费数据,只有上一个消费者消费完后,下一个消费者才能消费数据,下一个消原创 2017-04-03 20:55:01 · 238 阅读 · 0 评论 -
13.线程面试题一
一、 第一题:现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象。原始代码如下public class aa { public static void main(String[] args) { System.out.println("beg原创 2017-04-03 20:18:06 · 181 阅读 · 0 评论 -
2.定时器
一、Timer类和TimerTask类import java.util.Date;import java.util.Timer;import java.util.TimerTask;/** * JDK1.5以前的定时器 * schedule(TimerTask task, long delay, long period) * task:任务 * dalay:延时,也就是多原创 2017-03-21 22:12:27 · 272 阅读 · 0 评论 -
3.线程的同步互斥与通信
一、使用synchronized代码块及其原理二、使用synchronized方法三、分析静态方法所使用的同步监视器对象是什么?/** * 多线程应用:两个线程对同一个对象(数据)进行操作,就会出现线程安全的问题 * 线程问题:银行转账 * * 总结:互斥的关键字是 synchronized,必须用同一把锁挡住线程,否则线程不同步。 */public class T原创 2017-03-22 10:33:10 · 263 阅读 · 1 评论 -
28.线程池
①第四种获取线程的方法:线程池,一个ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用Executors工厂方法配置。②线程池可以解决两个不同的问题:由于减少了每个任务调用的开销,它们通常可以在执行大量的异步任务时提供增强的性能,并且还能提供绑定和管理资源(包括执行任务集中时使用的线程)的方法。每个ThreadPoolExector还维护着一些基本的统计数据原创 2017-04-08 08:29:13 · 277 阅读 · 0 评论 -
29.线程调度
ScheduledExecutorService:一个ExecutorService,可安排在给定的延迟后运行或定期执行的命令。import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.Executors;import java.util.concurrent.Futu原创 2017-04-08 08:40:24 · 255 阅读 · 0 评论 -
30.Fork/Join框架
一、Fork/Join框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行join汇总。二、Fork/Join框架与线程池的区别①采用“工作窃取”模式(work-stealing):当执行新的任务时可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的原创 2017-04-08 08:59:16 · 331 阅读 · 0 评论 -
4.ThreadLocal实现线程范围的共享变量
当没有ThreadLocal的时候,我们是这样实现线程范围内的变量共享的import java.util.HashMap;import java.util.Map;import java.util.Random;/** * map为每一个线程都放入了独立的数据,线程范围内的数据共享 */public class ThreadScopeShareData { private st原创 2017-03-25 10:38:57 · 290 阅读 · 1 评论 -
5.多个线程访问共享对象和数据的方式
一、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做public class TicketThread { public static void main(String[] args) { TicketWindow tw = new TicketWindow(); new Thread(tw,"一号窗原创 2017-04-02 09:58:04 · 413 阅读 · 0 评论 -
6.线程池
关于线程池的讲解:首先介绍在Tcp服务器编程模型的原理,每一个客户端连接用一个单独的线程为之服务,当与客户端的会话结束时,线程也就结束了,即每来一个客户端连接,服务器端就要创建一个新线程。这好比假设每个报名学员都要通过我来亲自接待,以便给每个学员一种好的感觉,但每个学员报名手续要花费半个小时,对于50名同学,我一个个接待和为之办理手续,显然不实际,我会怎么做呢?我会先接待每一个学员,打完招呼后原创 2017-04-03 07:15:00 · 214 阅读 · 0 评论 -
7.Callable&Future
1.Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现的。2.Callable要采用ExecutorSevice的submit方法提交,返回的future对象可以取消任务。3.CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象。好比我同时种了几块地的麦子,然后就原创 2017-04-03 07:50:47 · 184 阅读 · 0 评论 -
9.Semaphore实现信号灯
一、Semaphore可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。Semaphore实现的功能就类似厕所有5个坑,假如有十个人要上厕所,那么同时能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中的任何一个人让开后,其中在等待的另外5个人中又有一个可以占用了。另外等待的5个人中可以是随机获得原创 2017-04-03 15:24:54 · 256 阅读 · 0 评论 -
10.其他同步工具类
一、CyclicBarrierCyclic:循环的,有周期性的Barrier:障碍物,屏障 Latch:门闩,闩锁讲解CyclicBarrier的功能时,通过辅助画图的方式说明,效果会更好。\ / \ | /------------------------三个线程干完各自的任务,在不同的时刻到达集合点后,就可以接着忙各自的工原创 2017-04-03 16:13:11 · 196 阅读 · 0 评论 -
12.同步集合
一、传统集合类在并发访问时的问题说明.......由于并发控制不好,导致数据的不一致,引起的死循环。值得一提的是,HashMap不是一个线程安全的数据结构,要用到多个线程中去,需要自己加上同步标志,为什么会死循环呢,看看下面HashMap中get函数的源代码:public V get(Object key) { if (key == null) return getForN原创 2017-04-03 19:53:09 · 234 阅读 · 0 评论 -
27.线程八锁 -- 线程常使用的八种情况
上案例:public class Thread8Monitor { public static void main(String[] args) { final Number number = new Number(); final Number number2 = new Number(); new Thread(new Runnable() { public void原创 2017-04-06 21:35:06 · 3750 阅读 · 5 评论