做网站赚钱但又不想开公司,赣州做网站优化,网站优化排名网站,p2pjava 线程中创建线程在JDK 8之前#xff0c;还没有办法在Java中创建大型的线程安全的ConcurrentHashSet。 java.util.concurrent包甚至没有一个名为ConcurrentHashSet的类#xff0c;但是从JDK 8开始#xff0c;您可以使用新添加的keySet#xff08;默认值#xff09;和ne… java 线程中创建线程 在JDK 8之前还没有办法在Java中创建大型的线程安全的ConcurrentHashSet。 java.util.concurrent包甚至没有一个名为ConcurrentHashSet的类但是从JDK 8开始您可以使用新添加的keySet默认值和newKeySet方法来创建由ConcurrentHashMap支持的ConcurrentHashSet。 与战术解决方案不同例如将并发哈希映射与伪值一起使用或使用映射的设置视图您无法在其中添加新元素。 JDK 8的keySetdefaultValue和newKeySet方法返回的Set是一个合适的集合您还可以在其中添加新元素以及执行其他set操作例如containsremove等。这些方法仅在ConcurrentHashMap类中可用而在ConcurrentMap接口中不可用因此您需要使用ConcurrentHashMap变量来保存引用或者需要使用类型转换来强制转换存储在ConcurrentMAp变量中的ConcurrentHashMap对象。 Java并发API具有流行的Collection类的并发版本例如ArrayList的CopyOnArrayListHashMap的ConcurrentHahsMap和HashSet的CopyOnWriteArraySet但是Java中没有类似ConcurrentHashSet的东西。 即使CopyOnWriteArraySet是线程安全的它也不适合需要大型线程安全集的应用程序。 它仅用于集大小较小且只读操作远远超过写入操作的应用程序。 因此当您向Java程序员询问如何在不编写自己的类的情况下创建ConcurrentHashSet时许多人会说他们可以将ConcurrentHashMap与虚假值一起使用。 实际上这也是Java所做的因为如果您知道HashSet在内部使用具有相同值的HashMap。 但是这种方法的问题是您有一个地图并且没有设置。 您不能使用虚拟值在ConcurrentHashMap上执行设置操作。 当某些方法需要一个集合时您不能将其传递出去因此它不是很有用。 另一个选择是许多Java程序员都会提到您可以通过调用keySet方法从ConcurrentHashMap中获取Set视图该方法实际上返回一个Set您可以在其中执行Set操作并将其传递给需要Set的方法。但是这种方法也有其局限性例如Set由ConcurrentHashMAp支持并且Map中的任何更改也将反映在Set中。 另一个限制是您不能在此键集中添加新元素否则将引发UnsupportedOperationException。 看到 Java 8 in Action了解更多信息。 这两个限制现在已成为过去因为JDK 8添加了newKeySet方法该方法从给定类型其中值为Boolean.TRUE返回由ConcurrentHashMap支持的Set。 与从keySet方法返回的Set视图不同您还可以将新对象添加到此Set中。 该方法也很重载并接受初始容量以防止Set的大小调整。 以下是在Java 8中创建ConcurrentHashSet的代码示例 ConcurrentHashMap certificationCosts new ConcurrentHashMap();
Set concurrentHashSet certificationCosts.newKeySet();
concurrentHashSet.add(OCEJWCD); //OK
concurrentHashSet.contains(OCEJWCD); //OK
concurrentHashSet.remove(OCEJWCD); //OK 顺便说一句这并不是在Java中创建并发的大的线程安全的Set的唯一方法。 您还可以使用新添加的重载keySet默认值方法来创建ConcurrentHashSet。 此方法返回ConcurrentHashMap中的键的Set视图并使用给定的所有添加默认默认值即Collection.add和Collection.addAllCollection。 当然这只能用于您可以对Set中的所有元素使用相同的值这在大多数情况下是可以的因为您实际上并不关心Set中的值。 请记住HashSet还是一个对所有元素都具有相同值的HashMap有关更多详细信息请参见HashSet在Java内部的工作方式 。 这是在Java 8中使用keySetmapped value方法获取ConcurrentHashSet的示例 ConcurrentHashMap certificationCosts new ConcurrentHashMap();
Set concurrentHashSet certificationCosts.keySet(246);
concurrentSet.add(Spring enterprise); // value will be 246 but no error 您还可以与此Set一起执行其他Set操作例如addAllremoveremoveAllretainAllcontains。 它也是线程安全的因此可以在多线程Java应用程序中使用。 您可以了解有关真正不耐烦的Java SE 8上基于集合的操作的更多信息。 Java程序用于从ConcurrentHashMAp创建ConcurrentHashSet。 这是我们完整的Java程序它使用在java.util.concurrent.ConcurrentHashMap类上添加的新方法在Java 8中创建大型的线程安全的并发哈希集。 import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;/*
* Java Program to remove key value pair from Map while
* iteration.
*/
public class Demo {public static void main(String[] args) throws Exception {ConcurrentHashMap certificationCosts new ConcurrentHashMap();
certificationCosts.put(OCAJP, 246);
certificationCosts.put(OCPJP, 246);
certificationCosts.put(Spring Core, 200);
certificationCosts.put(Spring Web, 200);
certificationCosts.put(OCMJEA, 300);Set concurrentSet certificationCosts.keySet();System.out.println(before adding element into concurrent set: concurrentSet);
// concurrentSet.add(OCEJWCD); // will throw UnsupportedOperationExcetpion
System.out.println(after adding element into concurrent set: concurrentSet);// creating concurrent hash set in Java 8 using newKeySet() method
Set concurrentHashSet certificationCosts.newKeySet();concurrentHashSet.add(OCEJWCD);
concurrentHashSet.contains(OCEJWCD);
concurrentHashSet.remove(OCEJWCD);
System.out.println(after adding element into concurrent HashSet: concurrentSet);// you can also use keySet(defaultValue) method to add element into Set
concurrentSet certificationCosts.keySet(246);
concurrentSet.add(Spring enterprise); // value will be 246 but no error}}Output
before adding an element into the concurrent set:
[Spring Web, OCPJP, OCAJP, Spring Core, OCMJEA]
after adding an element into the concurrent set:
[Spring Web, OCPJP, OCAJP, Spring Core, OCMJEA]
after adding an element into concurrent HashSet:
[Spring Web, OCPJP, OCAJP, Spring Core, OCMJEA] 您可以看到如果尝试将新对象添加到由ConcurrentHashMAp的keySet方法返回的Set中则会抛出UnsupportedOperationExcepiton如下所示 线程“ main”中的异常java.lang.UnsupportedOperationException 在java.util.concurrent.ConcurrentHashMap $ KeySetView.addConcurrentHashMap.java:4594在Demo.mainDemo.java:23 这就是为什么我评论该代码的原因但是newKeySet和keySetmapped value方法返回的Set允许您将新元素添加到Set中那里没有错误。 顺便说一下这不是用Java创建线程安全Set的唯一方法。 甚至在Java 8之前都有一个名为CopyOnWriteArraySet的类该类允许您在Java中创建线程安全的集。 它类似于CopyOnWriteArrayList并且仅适用于集合大小小的应用程序并且您只读取唯一的操作因为它每次写入时都会将Set中的所有元素复制到新的Set中。 有关真正不耐烦的信息 请参阅Java SE 8以了解有关Java 8中并发集合的更多信息。 以下是CopyOnWriteArraySet的一些重要属性 1.它最适合于集大小通常较小的应用只读操作远远多于可变操作并且您需要防止遍历期间线程之间的干扰。 2.这是线程安全的。 3.可变操作添加设置删除等很昂贵因为它们通常需要复制整个基础数组。 4.迭代器不支持可变删除操作。 5.通过迭代器的遍历很快并且不会遇到其他线程的干扰。 6.迭代器在构造迭代器时依赖于数组的不变快照。 这就是如何在Java 8中创建ConcurrentHashSet的全部内容。 JDK 8 API不仅具有lambda表达式和流之类的主要功能而且还具有这些微小的变化使您的日常编码更加轻松。 使用newKeySet方法在Java中创建ConcurrentHashSet并非易事。 您不需要使用带有伪造值的集合之类的地图也不必使用keySet返回的集合视图的局限性后者不允许您向集合中添加新元素。 进一步阅读 使用Lambda表达式从Java 8中的集合到流 Java 8中用于数据处理的流收集器和可选项 Java 8实战 相关文章 如何用Java 8编写Comparator 如何在Java 8中读取文件 如何在Java 8中加入String 如何在Java 8中比较日期 如何在Java 8中格式化日期 如何在Java 8中对列表排序 非常感谢您阅读本文。 如果您喜欢本教程请与您的朋友和同事分享。 翻译自: https://www.javacodegeeks.com/2017/08/create-thread-safe-concurrenthashset-java-8.htmljava 线程中创建线程