java.util.concurrent相关内容

固定大小的并发地图

我需要一张具有以下要求的地图: 它应该是高度并发的.多个线程可以同时调用put(),get()和remove()方法. 它应该是固定大小.如果HashMap的大小达到最大值(例如10000),则不应在地图上添加新条目.不能是LRU高速缓存,其中最早的条目在达到最大大小时会被删除. ConcurrentHashMap可以满足#1.但是,不确定如何在ConcurrentHashMap ..

Java中的巧妙异步重绘

我有一个来自GUI问题的用例,我想提交给您. 用例 我有一个GUI,它根据用户在GUI中设置的某些参数显示计算结果.例如,当用户移动滑块时,会触发多个事件,所有这些事件都会触发新的计算.当用户将滑块值从A调整为B时,会触发数十个事件. 但是计算可能需要花费几秒钟的时间,而滑块调整会每隔100毫秒触发一次事件. 如何编写一个适当的线程来侦听这些事件,并对其进行过滤,以便重新绘 ..
发布时间:2020-05-13 23:39:18 Java开发

同步集合包装工厂方法如何“拥有"?对象传递进去了吗?

在《 Java Concurrency in Practice》一书中,Brian Goetz说,传递给类的构造函数和方法的对象不归类所有.是因为他们来自外面,而班级却无法控制他们吗? 他继续说,如果显式设计了一种方法来转移传入的对象的所有权(例如,同步集合包装器工厂方法),则这是一个例外.有人可以举一个例子,并向我解释如何将其视为例外吗? 解决方案 例外是 List ..

ThreadPoolExecutor与ForkJoinPool:窃取子任务

从Java文档开始, ForkJoinPool与其他类型的ExecutorService的不同之处主要在于采用了工作窃取:池中的所有线程都试图查找并执行由其他活动任务创建的子任务(如果不存在,则最终阻塞等待工作). 当大多数任务产生其他子任务时(这与大多数ForkJoinTasks一样),这可以实现高效处理.在构造函数中将asyncMode设置为true时,ForkJoinPools也 ..

ConcurrentHashMap中entrySet().removeIf的行为

我想使用ConcurrentHashMap来让一个线程定期从地图中删除某些项目,而让其他线程同时从地图中删除项目. 我正在删除线程中使用map.entrySet().removeIf(lambda).我想知道我可以对其行为做出什么样的假设.我可以看到removeIf方法使用迭代器来遍历映射中的元素,检查给定条件,然后根据需要使用iterator.remove()将其删除. 文档提供了有 ..

在Java中实现自己的阻塞队列

我知道这个问题以前已经被问过很多次,但是我只是想不通互联网上的例子,例如这两种解决方案都在put()方法中检查阻塞队列的数组/队列/链表是否为notifyAll等待线程,反之亦然.第二个链接中的评论强调了这种情况,并指出这是不必要的. 问题是;检查队列是否为空对我来说似乎也有些奇怪.通知所有正在等待的线程.有什么想法吗? 谢谢. 解决方案 到目前为止,我知道这是一个老问题,但是 ..

多线程执行,保留完成的工作项的顺序

我有一个工作单元流程,可以将它们称为“工作项",这些工作项是按顺序处理的(现在).我想通过多线程工作来加快处理速度. 约束:这些工作项按特定顺序排列,在处理过程中该顺序无关紧要-但是一旦处理完成,必须恢复该顺序. 类似这样的东西: |.| |.| |4| |3| |2| ..

具有单个线程池比多个线程池更好的设计

在Java中拥有多个线程池的优点和缺点是什么?我已经看过代码,其中有多个线程池用于不同的“类型"任务,并且我不确定是更好的设计还是只是开发人员感到懒惰.一个示例是使用 ScheduledThreadPoolExecutor 定期执行的任务或具有超时的任务,并使用其他ThreadPoolExecutor进行其他所有操作. 解决方案 拥有单独的专用线程池的目的是,使活动不会因线程不足而被饥饿, ..

什么是自适应旋转w.r.t锁获取?

适应性旋转技术是Java 6在改善固有锁性能方面的四个主要变化之一.自适应旋转到底是什么?它是自旋锁和互斥锁的组合吗?有人能以一种易于理解的方式解释该策略的有效性吗?默认情况下,此策略可从JDK6开始使用. 解决方案 什么是自适应旋转? 要引用此 Java 6性能页面: 自适应旋转是一种优化技术,其中线程尝试进行竞争的同步进入操作时使用了两阶段旋转然后阻止策略.此技术使线程 ..
发布时间:2020-05-13 20:43:37 Java开发

在方法的本地范围内创建的ReentrantLock对象将如何工作?

以上是OCP 7 java se书的屏幕打印.第791页. 我的问题是,是否每次在方法中创建一个新的ReentrantLock对象并将其锁定,如何阻止两个线程在lock和unlock之间运行代码块?这两个线程不会分别创建一个ReentrantLock对象并将其锁定吗?我可以想象,如果lock对象是仅实例化一次且从未更改的实例变量,它将如何工作. (最好是final). 我误会了吗? ..