随笔分类 - Java 多线程
摘要:守护线程与非守护线程 Java分为两种线程:用户线程和守护线程 所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,
阅读全文
摘要:20、线程池 背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交通工具。 好处 提高响应速度(减少了创建新线程的时间) 降低资源消耗(重复利用
阅读全文
摘要:19、生产者消费者问题 1.线程通信 应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止 如果仓库中放有产品,则消费者可以将产品取走消
阅读全文
摘要:18、Lock锁 从jdk5.0开始,java提供了更强大的线程同步机制——通过显示定义同步锁对象来实现同步。同步锁使用Lock对象充当 java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Loc
阅读全文
摘要:17、死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形。某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题。(两个或者多个线程互相抱着对方需要的资源,然后形成僵持) ####案例演示 //多个
阅读全文
摘要://测试juc安全类型的集合 public class TestJUC { public static void main(String[] args) { CopyOnWriteArrayList<String> copyOnWriteArrayList=new CopyOnWriteArrayL
阅读全文
摘要:18、线程同步机制 多个线程操作同一个资源 并发:同一个对象被多个线程同时操作 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,这时候我们就需要线程同步。线程同步其实就是一个等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程时候完毕,下一个线程
阅读全文
摘要:15、守护线程 线程分为用户线程和守护线程(daemon) 虚拟机需要确保用户线程执行完毕 虚拟机不用等待守护线程执行完毕(一般讲当用户线程结束后守护线程也会随之结束但不一定一定随用户线程结束而结束) 如,后台记录操作日志,监控内存,垃圾回收等 public class TestDaemon { p
阅读全文
摘要:14、线程的优先级 java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程 线程的优先级用数字表示,范围从1~10 Thread.MIN_PRIORITY =1 Thread.MAX_PRIORITY =10 Thread.NORM_PRIORI
阅读全文
摘要:Thread.State 线程状态。线程可以处于以下状态之一 new 尚未启动的线程处于状态 runnable 在java虚拟机中执行的线程处于此状态 blocked 被阻塞 等待监视器锁定的线程处于此状态 waitiing 正在等待另一个线程执行特定动作的线程处于此状态 timed_waiting
阅读全文
摘要:#Lamda表达式简化线程创建方式 ####实际上本质还是实Runnable接口的一种方法,此方法的好处是可以简化代码,利用函数式接口,将原先需要实现Runnable接口重写run方法的部分,简化为 new Runnable(){}形式(创建线程对象时实现接口方法),再简化为函数式接口Lamda表达
阅读全文
摘要:12、线程强制执行_join Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞 可以想象成插队 //测试join方法(vip插队) public class TestJoin implements Runnable{ @Override public void run() { fo
阅读全文
摘要:11、线程礼让_yield 礼让线程,让当前正在执行的线程暂停,但不阻塞 将线程从运行状态转为就绪状态 让cup重新调度,礼让不一定成功,看cup调度 /*测试礼让线程,礼让不是阻塞和sleep不同, 是将线程状态置为就绪态不是阻塞态, 此时运行的先后顺序还是要看cpu心情 所以礼让可能不会成功 *
阅读全文
摘要:10、线程休眠_sleep sleep(long millis) 指定当前线程阻塞的毫秒数 sleep存在异常InterruptException sleep时间达到后线程进入就绪状态 sleep可以模拟网络延时,倒计时等 每一个对象都有一个锁,sleep不会释放锁 ####抢票Demo //模拟网
阅读全文
摘要:11、线程停止 线程状态 线程方法 方法 说明 setPriority(int newPriority) 更改线程的优先级 static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠 void join() 等待该线程终止 static void yiel
阅读全文
摘要:##08、静态代理模式(Thread和Runnable底层实现机制) /* * 真实对象和代理对象都要实现同一个接口 * 代理对象要代理真实对象 * 好处: * 代理对象可以做很多真实对象做不了的事情 * 真实对象专注做自己的事情 */ public class StaticProxy { publ
阅读全文
摘要:07、Lambda表达式 希腊字母表排序第十一位的字母,英语名称为Lambda 避免匿名内部类定义过多 其实质属于函数式编程的概念 为什么要使用lambda表达式 避免匿名内部类定义过多 可以让你的代码看起来很简洁 去掉了一堆没有意义的代码,只留下了核心的逻辑 也许你会说,我看了lambda表达式,
阅读全文
摘要:##实现Callable接口 实现Callable接口,需要返回值类型 重写call方法,需要抛出异常 创建目标对象 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1) 提交执行Future result1 = ser.submi
阅读全文
摘要:##龟兔赛跑问题 public class TestThread5 implements Runnable{ private static String winner;//注意final是静态常量不可修改 private static int num=0; @Override public void
阅读全文
摘要:##多线程并发问题 //多个线程同时操作同一个对象 //买火车票的例子 public class TestThread4 implements Runnable{ //票数 private int tickerNums =10; @Override public void run() { while
阅读全文