随笔分类 - Java多线程
摘要:背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。 好处: 提高响应速度(减少了创建新线程的时间) 降低资源消耗(重复利用线程池中线程
阅读全文
摘要:线程通信: 应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库﹐消费者将仓库中产品取走消费 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止 如果仓库中放有产品,则消费者可以将产品取走消费﹐否则停止消费并等待,直到
阅读全文
摘要:从JDK5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当 java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开
阅读全文
摘要:死锁: 多个线程各自占有一些共享资源﹐并且互相等待其他线程占有的资源才能运行﹐而导致两个或者多个线程都在等待对方释放资源﹐都停止执行的情形﹒某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题. 产生死锁的四个必要条件: 互斥条件:一个资源每次只能被一个进程使用。 请求与保持条件:
阅读全文
摘要:同步方法: 由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提出一套机制,这套机制就是synchronized关键字,它包括两种用法:synchronized方法和synchronized块. 同步方法:public synchronized void met
阅读全文
摘要:1. 不安全买票 public class UnSafeBuyTicket { public static void main(String[] args) { BuyTicket buyTicket = new BuyTicket(); new Thread(buyTicket,"张三").sta
阅读全文
摘要:并发:同一个对象被多个线程同时操作 现实生活中,我们会遇到"同一个资源,多个人都想使用”的问题,比如,食堂排队打饭,每个人都想吃饭,最天然的解决办法就是:排队,一个个来。 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象.这时候我们就需要线程同步,线程同步其实就是一种等待机制,
阅读全文
摘要:线程分为用户线程和守护线程 虚拟机必须确保用户线程执行完毕,如main()线程 虚拟机不用等待守护线程执行完毕,如后台记录操作日志,监控内存,垃圾回收:gc()等。 public class ThreadDaemon { public static void main(String[] args)
阅读全文
摘要:Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。 线程的优先级用数字表示,范围从1~10. Thread.MIN_PRIORITY = 1; Thread.MAX_PRIORITY = 10; Thread.NORM_PRIORIT
阅读全文
摘要:线程可以处于以下状态之一: NEW 尚未启动的线程处于此状态。 RUNNABLE 在Java虚拟机中执行的线程处于此状态。 BLOCKED 被阻塞等待监视器锁定的线程处于此状态。 WAITING 正在等待另一个线程执行特定动作的线程处于此状态。 TIMED_WAITING 正在等待另一个线程执行动作
阅读全文
摘要:Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞 可以了解成插队 public class ThreadJoin implements Runnable{ @Override public void run() { try { Thread.sleep(100); } catch
阅读全文
摘要:礼让线程,让当前正在执行的线程暂停,但不阻塞 将线程从运行状态转为就绪状态 让cpu重新调度,礼让不一定成功!看CPU心情 代码: public class ThreadYield implements Runnable{ public static void main(String[] args)
阅读全文
摘要:sleep(时间)指定当前线程阻塞的毫秒数; sleep存在异常InterruptedException; sleep时间达到后线程进入就绪状态; sleep可以模拟网络延时,倒计时等。 每一个对象都有一个锁,sleep不会释放锁; 倒计时Demo: public class ThreadSleep
阅读全文
摘要:建议线程正常停止:利用次数,不建议死循环。 建议使用标志位:设置一个标志位 不要使用stop或者destroy等过时或者JDK不建议使用的方法 public class ThreadStop implements Runnable{ private boolean flag = true; publ
阅读全文
摘要:流程: 详细: 方法 说明 setPriority(int newPriority) 更改线程的优先级 static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠线程 void join() 等待该线程终止 static void yield() 暂停当前
阅读全文
摘要:1. Lambda(λ)表达式: λ希腊字母表中排序第十一位的字母,英语名称为Lambda 避免匿名内部类定义过多 其实质属于函数式编程的概念 2. 为什么要使用Lambda表达式? 避免匿名内部类定义过多 可以让你的代码看起来很简洁 去掉了一堆没有意义的代码,只留下核心的逻辑。 3. 也许你会说,
阅读全文
摘要:对比: new WeddingCompany(new You()).HappyMarry(); new Thread(()->{System.out.println("我爱你");}).start(); 静态代理总结: 真实对象和代理对象需要实现同一个接口 代理对象需要代理真是角色 静态代理好处:
阅读全文
摘要:步骤: 实现Callable接口,需要返回值类型 重写call方法,需要抛出异常 创建目标对象 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1); 提交执行:Future<Boolean> result1 = ser.submi
阅读全文
摘要:案例: 首先来个赛道距离,然后要离终点越来越近 判断比赛是否结束 打印出胜利者 龟兔赛跑开始 故事中是乌龟赢的,兔子需要睡觉,所以我们来模拟兔子睡觉 终于,乌龟赢得比赛 代码: public class Race implements Runnable{ final int nums=100; pr
阅读全文
摘要:模拟买票的场景:张三、李四和王五一起买票。 代码: public class TicketThread implements Runnable{ private int ticket =3; public static void main(String[] args) { TicketThread
阅读全文