摘要:现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象。原始代码如下: 刚看到题目还想着很简单;直接在Test.parseLog(log)的地方new4个线
阅读全文
摘要:传统集合实现同步的问题 举了一个例子:Map集合线程不同步导致的问题。 解决办法:使用同步的Map集合 使用集合工具类中的方法将不同步的集合转为同步的Collections.synchronizedMap(new Map())这个方法返回一个同步的集合 public static <K, V> Ma
阅读全文
摘要:队列包含固定长度的队列和不固定长度的队列,先进先出 固定长度的队列往里放数据,如果放满了还要放,阻塞式队列就会等待,直到有数据取出,空出位置后才继续放;非阻塞式队列不能等待就只能报错了。 讲Condition时提到了阻塞队列的原理,Java中已经实现了阻塞队列ArrayBlockingQueue B
阅读全文
摘要:用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人会一直等待第二个人,直到第二个人拿着数据到来时,才能彼此交换数据。 举例:毒品交易 双方并不是同时到达,有先有后,只有都到达了,瞬间交换数据,各自飞 代码演示: java.util.concurrent.Ex
阅读全文
摘要:例如:组织人员(线程)郊游,约定一个时间地点(路障),人员陆续到达地点,等所有人员全部到达,开始到公园各玩各的,再到约定时间去食堂吃饭,等所有人到齐开饭…… java.util.concurrent.CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (com
阅读全文
摘要:好像倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当到达0时,所有等待者就开始执行。 举例:多个运动员等待裁判命令: 裁判等所有运动员到齐后发布结果 代码示例: java.util.concurrent.CountDownLatch 一个同步辅助类,在完成
阅读全文
摘要:Semaphore可以维护当前访问自身的线程个数,并且提供了同步机制。 semaphore实现的功能类似于厕所里有5个坑,有10个人要上厕所,同时就只能有5个人占用,当5个人中 的任何一个让开后,其中在等待的另外5个人中又有一个可以占用了。 一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必
阅读全文
摘要:Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Condition就是解决这个问题的,实现线程间的通信。比如CPU让小弟做事,小弟说我先歇着并通知大哥,大
阅读全文
摘要:读写锁,分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥,由JVM控制。 ReentrantReadWriteLock 构造方法摘要 ReentrantReadWriteLock() 使用默认(非公平)的排序属性创建一个新的 ReentrantReadWriteLock。 Reentr
阅读全文
摘要:java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类, 接口摘要 Condition Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个
阅读全文
摘要:如果没有线程池,需要在run方法中不停判断,还有没有任务需要执行 线程池的通俗比喻:接待客户,为每个客户都安排一个工作人员,接待完成后该工作人员就废掉。服务器每收到一个客户请求就为其分配一个线程提供服务,服务结束后销毁线程,不断创建、销毁线程,影响性能。 线程池:先创建多个线程放在线程池中,当有任务
阅读全文
摘要:获取一个线程的运行结果 public interface Callable<V> 返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返
阅读全文
摘要:Java5的线程并发库 java.util.concurrent在并发编程中很常用的实用工具类。 | locks为锁和等待条件提供一个框架的接口和类, 它不同于内置同步和监视器 | atomic类的小工具包,支持在单个变量上解除锁的线程安全编程。 可以对基本类型、数组中的基本类型、类中的基本类型等进
阅读全文
摘要:例子:卖票:多个窗口同时卖这100张票,票就需要多个线程共享 a、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个对象中有共享数据。 卖票就可以这样做,每个窗口都在做卖票任务,卖的票都是同一个数据。 b、如果每个线程执行的代码不同,就需要使用不同的Runnable对象,有两种方式
阅读全文
摘要:JDK1.5提供了ThreadLocal类来方便实现线程范围内的数据共享,它的作用就相当于上一节中的Map。 每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map集合中增加一条记录,key就是各自的线程,value就是各自的set方法传进去的值。 在线程结束时可以调用Th
阅读全文
摘要:线程范围内共享数据图解: 代码演示: 结果并没与实现线程间的数据同步,两个线程使用的是同一个线程的数据。要解决这个问题,可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据。代码实现:上面红色部分 程序中存在的问题:获取的数据与设置的数据不
阅读全文
摘要:线程安全问题例子:银行转账 同一个账户一边进行出账操作(自己交学费),另一边进行入账操作(别人给自己付款),线程不同步带来的安全问题。 示例:逐个字符的方式打印字符串 注意: 内部类不能访问局部变量,要访问需加final 静态方法中不能创建内部类的实例对象 打印结果发现的问题:线程不同步所致,两个线
阅读全文
摘要:面试题,子线程10次与主线程100次来回循环执行50次 下面是我刚看完面试题就暂停视频自己试着写的代码,还可以,结果完成要求了在单次循环结束后让这个刚结束循环的线程休眠,保证另一个线程可以抢到执行权。 张老师讲的方法: 1、将子线程和主线程中要同步的方法进行封装,加上同步关键字实现同步 2、两个线程
阅读全文
摘要:传统定时器的创建:直接使用定时器类Timer a、过多长时间后炸 new Timer().schedule(TimerTask定时任务, Date time定的时间); b、过多长时间后炸,以后每隔多少时间再炸 new Timer().schedule(TimerTask定时任务, Long延迟(第
阅读全文
摘要:线程就是程序的一条执行线索/线路。 创建线程的两种传统方式 1.创建Thread的子类,覆盖其中的run方法,运行这个子类的start方法即可开启线程 2.创建Thread时传递一个实现Runnable接口的对象实例 问题:下边的线程运行的是Thread子类中的方法还是实现Runnable接口类的方
阅读全文