0 0

双层HashSet 使用多线程读取问题5

   public static void main(String[] args) {
HashSet<String> hsSet = new HashSet<String>();
for (int i = 0; i < 1000; i++) {
hsSet.add("" + i);
}
Iterator<String> itter = hsSet.iterator();
while (itter.hasNext()) {
String a = itter.next();
HashSet<String> endHashSet  = addHashSet(a);
Set<String> syHashSet = Collections.synchronizedSet(endHashSet);
final Iterator<String> endItter = syHashSet.iterator();
class GetEnd implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
while (endItter.hasNext()) {
System.out.println(endItter.next());
}
}
}
ExecutorService pool = Executors.newFixedThreadPool(100);
GetEnd t = new GetEnd();
pool.execute(t);
pool.shutdown();
}
}
public static HashSet<String> addHashSet(String a){
HashSet<String> hashSet = new HashSet<String>();
for (int i = 0; i < 10; i++) {
hashSet.add(i + a);
}
return hashSet;
}


代码入上. 第一层HashSet获取到内容之后,根据 next()内容再次封装一个HashSet 第二层的HashSet使用线程池读取...
但是好像这个线程池并没有关闭。求指点...这个应该怎么写..谢谢!
2014年7月10日 11:42

1个答案 按时间排序 按投票排序

0 0

采纳的答案

线程池你每个循环, 都创建一个, 然后关闭只是当前,
下次又重新创建了

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class App {

	public static void main(String[] args) {
		HashSet<String> hsSet = new HashSet<String>();
		for (int i = 0; i < 10; i++) {
			hsSet.add("" + i);
		}
		
		Iterator<String> itter = hsSet.iterator();
		ExecutorService pool = Executors.newFixedThreadPool(1);
		
		while (itter.hasNext()) {
			String a = itter.next();
			HashSet<String> endHashSet = addHashSet(a);
			Set<String> syHashSet = Collections.synchronizedSet(endHashSet);
			final Iterator<String> endItter = syHashSet.iterator();
			class GetEnd implements Runnable {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName());
					while (endItter.hasNext()) {
						System.out.println(endItter.next());
					}
				}
			}
			
			if(!pool.isShutdown()) {
				GetEnd t = new GetEnd();
				pool.execute(t);
				pool.shutdown();
			}
		}
	}

	public static HashSet<String> addHashSet(String a) {
		HashSet<String> hashSet = new HashSet<String>();
		for (int i = 0; i < 10; i++) {
			hashSet.add(i + a);
		}
		return hashSet;
	}
}

2014年7月10日 13:45

相关推荐

    hashset类的使用

    我们还演示了remove方法来删除一个元素,使用size方法获取了HashSet中元素的数量,并最终使用迭代器遍历了HashSet中的所有元素。 在实际应用中,HashSet因其存储元素的唯一性和对元素添加、删除、查询的高效性而...

    HashSet详解和使用示例_动力节点Java学院整理

    HashSet是Java编程语言中的一种集合类...然而,在多线程环境下,为了保证线程安全,可以使用`Collections.synchronizedSet`方法来包装HashSet,或者考虑使用ConcurrentHashMap来构建一个线程安全的集合并实现类似功能。

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了...非线程安全:HashSet 类本身不是线程安全的,在多线程环境下需要进行外部同步操作,或者使用 Collections.synchronizedSet 方法封装成线程安全的集合。

    HashSet类的用法.pdf

    此外,`HashSet`是非同步的,这意味着多线程环境下的安全问题需要通过外部同步机制解决。 #### 二、特点 1. **无序性**:`HashSet`中的元素是无序的,即不能保证元素的存储顺序与插入顺序一致。 2. **非同步性**:...

    Java多线程的聊天室程序

    例如,在服务器端将所有客户端的Socket存储在HashSet集合中时,需要保证这个集合在多线程环境下是线程安全的。另外,为了优化性能和资源利用,应当合理管理线程的生命周期,避免无谓的线程创建和销毁,或者使用...

    HashSet的实现原理

    由于HashSet是基于HashMap实现的,所以它的很多操作都类似于HashMap。比如,添加元素时,实际上是在HashMap中添加一个键为元素,值为PRESENT的键值对。判断元素是否存在时,是看HashMap中是否存在这个键。删除元素时...

    java的一些图片,网络编程,多线程,数据结构

    线程同步是多线程编程中的关键问题,Java提供了`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法以及`java.util.concurrent`包中的高级并发工具,如Semaphore、CountDownLatch、CyclicBarrier等,来...

    HashSet和TreeSet.doc

    此外,HashSet 不保证线程安全,如果在多线程环境下使用,需要自行处理同步问题。 另一方面,TreeSet 是 SortedSet 接口的实现,它内部使用了红黑树(Red-Black Tree)数据结构,这使得 TreeSet 自动对元素进行了...

    HashSet去重

    - **`HashSet`与`HashMap`的关系**:实际上,`HashSet`底层是使用`HashMap`实现的,`HashSet`中的元素实际上是`HashMap`的键(key),值(value)为一个固定的静态对象(`PRESENT`)。 #### 七、结论 通过上述分析可以...

    Java集合多线程安全.docx

    线程安全指的是一个对象在多线程环境下可以被正确地访问和修改,而不会出现竞态条件或死锁等问题。 线程不安全的集合类包括: 1. `ArrayList`:它的添加、删除和修改操作不是线程安全的。例如,在多个线程同时尝试...

    java资料\、文件资料、多线程和xml解析_资料汇总

    本篇内容涵盖了 Java 集合框架中 `Set`、`List` 和 `Map` 的核心概念及其实现细节,同时还包括了数组的基本用法以及多线程和 XML 解析的基础知识。这些内容对于 Java 开发者来说是非常重要的基础知识,掌握它们可以...

    多线程中使用Java集合类.doc

    在多线程环境中,使用Java集合类需要注意线程安全问题,因为不同的线程可能会同时访问和修改集合,导致数据不一致或引发异常。本篇主要讨论在并发编程中使用Java集合类的一些关键知识点。 首先,Java集合框架中的大...

    HashMap与HashTable和HashSet的区别

    - **线程安全性**:`HashMap`不是线程安全的,如果多个线程同时访问,必须在外部进行同步控制。 - **null的支持**:`HashMap`允许一个键为`null`,且允许多个值为`null`。 - **初始容量和加载因子**:`HashMap`同样...

    JAVA集合、多线程

    Java集合与多线程是Java编程中的两个核心概念,它们在实际开发中有着广泛的应用。本文将深入探讨这两个主题,并结合实例进行详细讲解。 首先,我们来看Java集合。集合是Java提供的一种数据结构,用于存储多个对象。...

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    HashSet工作原理_动力节点Java学院整理

    对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:

    c++用vector实现HashSet

    不过,在这个场景中,我们将探讨如何使用`std::vector`来模拟HashSet的行为。 `std::vector`是C++标准库中的动态数组,它允许我们在运行时调整大小。为了用`std::vector`实现HashSet,我们需要关注几个关键点:插入...

    treemap treeset hashset hashmap 简要介绍

    `HashSet`的底层使用了`HashMap`,实际上,`HashSet`内部就是一个`HashMap`,其中所有值都被设置为`null`。 ### HashMap `HashMap`是基于哈希表实现的`Map`接口,它提供了快速的插入、删除和查找操作。`HashMap`...

Global site tag (gtag.js) - Google Analytics