`
lijunaccp
  • 浏览: 160489 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

空中网的一个用线程操作集合遇到的问题

 
阅读更多
package com.test;

/**
 * 当每个线程中指定的KEY相同时,
 * 这些相同KEY的线程应每隔一秒依次输出时间值(互斥),
 * 如果KEY不同,则并行执行(相互之间不互斥)
 */
public class Test extends Thread
{

	private TestDo testDo;
	private String key = "1";
	private String value;
	
	public Test(String key,String key2,String value){
		testDo = TestDo.getInstance();
		this.key = new String(key+key2);
		this.value = value;
	}
	
	public static void main(String[] args)
	{
		Test a1 = new Test("1","","1");
		Test a2 = new Test("1","","2");
		Test a3 = new Test("1","","3");
		Test a4 = new Test("1","","4");
		
		Test b1 = new Test("2","","1");
		
		Test c1 = new Test("3","","1");
		
		Test d1 = new Test("4","","1");
		
		System.out.println("begin:"+(System.currentTimeMillis()/1000));
		
		a1.start();
		a2.start();
		a3.start();
		a4.start();
		
		b1.start();
		
		c1.start();
		
		d1.start();
	}
	
	@Override
	public void run()
	{
		try{
			testDo.doSome(key, value);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}

package com.test;

import java.util.Iterator;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

public class TestDo
{
	private Set set = new CopyOnWriteArraySet();

	private TestDo()
	{
	};

	private static TestDo testDo = new TestDo();

	public static TestDo getInstance()
	{
		return testDo;
	}

	public void doSome(String key, String value) throws Exception
	{
		Object o = null;
		if (!set.contains(key))
		{
			set.add(key);
			o = key;
		}
		else
		{
			for(Iterator it = set.iterator();it.hasNext();){
				Object oo = it.next();
				Thread.sleep(new Random().nextInt(100));
				if(key.equals(oo)){
					o = oo;
					break;
				}
			}
		}
		
		synchronized(o){
			try{
				System.out.println(key + ":" + value + ":"
						+ (System.currentTimeMillis()/1000));
			}catch(Exception e){
				e.printStackTrace();
			}
			Thread.sleep(1000);
		}
	}

}

分享到:
评论

相关推荐

    Java多线程安全集合

    同步集合在每个方法上加锁,确保同一时间只有一个线程可以执行操作。虽然提供了基本的线程安全性,但它们不是高度优化的并发解决方案,因为所有操作都需要全局锁定,可能导致性能瓶颈。 2. 并发集合(Concurrent ...

    空中网线程题整理

    这样,在同一时刻只有一个线程能够进入该方法执行,从而避免了多个线程同时使用相同`key`而导致的结果混乱问题。 综上所述,这三个题目分别考察了应聘者对于多线程基本概念、同步机制以及并发编程的理解与应用能力...

    C#线程例子集合

    它使用 Monitor 对象内部,确保同一时间只有一个线程执行锁定代码块。 2. **HTTP通信**: - **HttpClient类**:在C#中,HttpClient类是进行HTTP通信的标准工具,可以用来发送GET、POST等各种HTTP请求。创建...

    Java多线程运算集合

    - **线程**:是进程中的一个执行单元,一个进程中可以包含多个线程,这些线程共享同一个进程的内存资源。 - **多任务与多线程**: - 多任务是指操作系统能够同时处理多个任务的能力,而多线程则是实现多任务的一...

    QT中sqlite多线程操作4个注意问题

    在开发基于Qt的应用程序时,经常会遇到需要使用多线程来进行SQLite数据库操作的情况。然而,多线程环境下的数据库操作相较于单线程来说更为复杂,需要特别注意一些细节问题,以确保程序的稳定性和效率。本文将总结在...

    C# 多线程资料集合

    总之,这个资料集合为C#开发者提供了一个全面的多线程学习路径,无论你是初学者还是经验丰富的开发者,都可以从中获取宝贵的实战经验和理论知识,进一步提升你的多线程编程技能。通过深入理解并熟练运用这些概念和...

    c#官方线程安全集合源码

    `ConcurrentBag<T>` 是一个线程安全的集合,用于存储任意数量的元素,它实现了可变大小的多生产者、多消费者队列。这个类适用于需要快速添加和删除元素的场景,尤其是当元素的顺序不是特别重要的时候。`...

    Java集合多线程安全.docx

    1. 使用`Vector`:虽然它是线程安全的,但由于每个操作都进行同步,其性能通常低于非线程安全的集合,因此不推荐在性能要求高的场景中使用。 2. 使用`Collections.synchronizedList`:这个静态方法可以将给定的`...

    java 多线程操作数据库

    本文将基于一个具体的Java多线程操作数据库的应用程序,深入探讨其背后的原理、实现细节以及潜在的挑战。 #### 核心知识点: 1. **多线程基础**:多线程是Java编程中的一个重要概念,允许程序同时执行多个任务。在...

    C#多线程List的非线程安全性

    在C#编程中,多线程环境下的数据操作是一个复杂且需要谨慎处理的领域。本文将深入探讨在多线程环境中使用List时遇到的非线程安全问题,并提供相应的解决方案和最佳实践。 List是.NET框架中常用的一个动态数组,它...

    易语言多线程操作

    多线程是指一个程序内同时执行多个独立的线程,每个线程都有自己的执行序列,可以并发执行不同的任务。 在易语言中进行多线程操作,主要涉及以下几个知识点: 1. **线程创建**:在易语言中,可以通过`创建线程`...

    多线程集合及IO面试

    - **基本概念**:线程是程序执行流的最小单元,一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成。 - **生命周期**:Java中线程的生命周期主要包括NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)...

    关于winform使用timer进行多线程操作的例子

    为了解决这个问题,我们可以使用`Control.Invoke`或`Control.BeginInvoke`方法将更新UI的操作放到UI线程中执行: ```csharp if (this.InvokeRequired) { this.Invoke(new Action(() => { // 更新UI控件 label...

    一个多线程示例程序及多线程常见问题介绍

    在这个主题中,我们将深入探讨一个多线程示例程序以及在使用多线程时可能遇到的常见问题。 首先,我们来看标题中提到的"一个多线程示例程序"。在C++Builder中,创建多线程通常涉及使用`TThread`类,这是VCL(Visual...

    c# 委托访问listbox多线程操作

    - **线程安全的集合**:在多线程环境中,可以考虑使用线程安全的集合类(如 `ConcurrentBag<T>` 或 `ConcurrentQueue<T>`),以减少锁的竞争并提高性能。 - **异步编程模型**:除了多线程外,还可以使用 C# 中的异步...

    项目开发中碰到的一个线程问题 (二)

    本文将探讨一个在实际项目中遇到的线程问题,并基于提供的"reflect"标签,我们来深入理解Java中的反射(Reflection)如何与线程交互,以及它可能引发的问题。 线程问题通常涉及到竞态条件、死锁、资源争抢等。在...

    JAVA集合、多线程

    2. **线程同步**:为了防止多线程环境下数据的不一致,Java提供了synchronized关键字,可以保证同一时刻只有一个线程访问同步代码块。此外,还有wait()、notify()和notifyAll()方法用于线程间通信。 3. **线程池**...

    Android多线程操作sqlite(Sqlite解决database locked问题)

    在Android中,如果多个线程同时尝试对同一个SQLite数据库进行读写操作,就可能导致这种锁定情况。 为了解决这个问题,我们可以采取以下策略: 1. **使用SQLiteOpenHelper的子类**:创建一个自定义的...

Global site tag (gtag.js) - Google Analytics