![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
文章平均质量分 53
无
lolxxs
这个作者很懒,什么都没留下…
展开
-
使用线程池的shutdown()使主线程等待子线程执行完所有任务是错误的
主线程给所有的子线程发送中断信号,而子线程当执行完手上的任务的时候就会先去检测是否已经收到了中断信号(其实就是一个布尔型的值,是否被设置了),如果已经检测到中断信号了,则不会去阻塞队列中取出新的任务,所以所有任务是不会执行完毕的。CountDownLatch有一个计数器,子线程负责将计数器减一,主线程负责调用await()等待,当某个子线程将计数器减为0的时候,就会唤醒主线程。Future.get()时是阻塞的,会等待子线程执行完毕主线程才能获取到结果,相当于主线程在等待该子线程。原创 2023-08-28 17:07:10 · 327 阅读 · 0 评论 -
线程池执行带有自己定义的变量Runnable以及Callable任务时,必须每次都新建任务
其结果都为B,由于主线程会比子线程快速执行完,所以两次任务都用到的是同一个变量。原创 2023-07-22 14:35:27 · 178 阅读 · 0 评论 -
Java CyclicBarrier类
总结CyclicBarrier类提供一个屏障方法,可以让指定数量的线程一起同步,在构造方法CyclicBarrier(int parties, Runnable barrierAction)的parties指定需要同步的线程数,barrierAction是当指定数目的线程同步的时候会自动执行barrierAction方法,由最后一个线程调用CyclicBarrier类实现原理非常简单,维持一个计数器计时器CyclicBarrier类方法方法名作用CyclicBarrier(i原创 2022-01-10 11:24:21 · 294 阅读 · 0 评论 -
Java 多线程 isInterrupted() 和 interrupt() 还有 interrupted()区别 从源码层面总结
我们研究对象有3个1.thread.isInterrupted():判断是否有中断标志2.thread.interrupt() : 添加中断标志3.Thread.interrupted() 判断是否有中断标志thread是实例对象,Thread是类名称说明Thread.interrupted()是静态方法thread.isInterrupted() 和 Thread.interrupted()作用类似,重点研究它们两个它们的源码 public static boolean interrupte原创 2021-08-05 11:03:10 · 119 阅读 · 0 评论 -
Java多线程 使用isInterrupted() 和 interrupt()结合异常法可预知的中断线程
在Java多线程中我们可以使用stop()强行终止线程,但是运行这个方法,会发生什么,在什么时候终止线程,这都是不可以预知的,所以stop()方法被作废过期,取而代之的是thread.isInterrupted() 判断中断标志是否为true**thread.interrupt()**使得中断标志为true,默认为false单独使用thread.interrupt()TestThread .classpublic class TestThread extends Thread { @O原创 2021-08-05 11:01:52 · 170 阅读 · 0 评论 -
Java 多线程 join() 使得主线程等待子线程运行完毕后再运行主线程代码 从join()源码看本质 总结
join()通常的说法是使得主线程等待子线程运行完毕后再运行,但是可以扩展为一个线程调用一个线程对象的join()方法,那么使用该join()的线程会等待线程对象start()开启的线程执行完后再执行代码例子Test.classpublic class Test { public static void main(String[] args) { try { MyThread myThread = new MyThread();原创 2021-08-05 10:14:48 · 335 阅读 · 0 评论 -
Java多线程 使用wait()和notify()还有notifyAll() 自己实现带有等待队列的多生产者多消费者的生产消费模式 详细代码
该小项目有6个类,如下:Container.class容纳生产者生产的消息,包含3个方法,往等待消费队列里面添加add(),取出pop()消息,获取消息的数量size(),这三个方法都是同步方法AddService.class入队列方法类AddValueThread.class:入队列线程类PopService.class:出队列方法类PopValueThread.class:出队列线程类Test.class.class:测试类项目代码:Container.classpublic cla原创 2021-08-04 20:55:46 · 128 阅读 · 0 评论 -
Java多线程 wait() 和 notify() 还有notifyAll() 使用前提和作用以及判断唤醒哪些线程的本质总结
Object有关于多线程的默认方法,它们的作用如下:wait() : 使得调用的此方法的线程等待notify() : 唤醒一个等待中的线程(通常是最先等待的线程)notifyAll():唤醒所有等待中的线程(倒序唤醒,即最近wait()最先被唤醒)使用前提上面三个方法,使用之前必须获得锁,即必须在synchronized方法里面或者synchronized代码块中使用,如:public class A { synchronized public void backupA() {原创 2021-08-04 19:19:16 · 379 阅读 · 0 评论 -
Java 的 volatile 关键字与 synchronized 作用及特点总结 前者具有可见性和禁止代码重排序 后者多了原子性
volatile关键字作用:1.可见性2.禁止代码重排序synchronized 方法或代码块作用:1.可见性2.原子性3.禁止代码重排序1.可见性原理volatile 线程具有工作内存,工作时只写入读取工作内存,这个工作内存是每个线程私有的,所以这就是造成不可见的原因添加了 volatile 关键字后,线程会从主内存中读取数据,而主内存是每个线程公有的,所以就保证了数据可见性2.数据数据指什么public class TestThread extends Thread {原创 2021-08-04 16:55:15 · 126 阅读 · 0 评论 -
Java多线程 synchronized 锁方法和块使用总结 锁竞争本质原理 只与锁对象有关与位置无关
首先要明确 synchronized 什么时候会出现锁竞争即当锁对象相同的时候会出现锁竞争包含两个范畴 锁对象来源 和 同步代码块位于什么位置锁对象来源1.synchronized(this) {} 代码块 和 public synchronized void test()方法它们的锁都是 当前类的实例对象2.synchronized(Class) {} 代码块 和 public synchronized static void test()方法它们的锁都是 当前类对象Class3.sync原创 2021-08-02 09:53:59 · 721 阅读 · 0 评论 -
Java多线程 notify() 方法唤醒一个线程 唤醒顺序为使用wait()的顺序
notify()方法唤醒处于等待的线程 谁先等待即谁先调用wait()就唤醒谁测试案例:四个类MyService.class 方法类MyThreadA.class 等待线程类MyThreadB.clsss 唤醒线程类Test.class 测试线程类MyService.classpublic class MyService { private Object lock = new Object(); public void waitMethod() { try原创 2021-07-31 18:48:29 · 883 阅读 · 0 评论