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);
}
}
}
分享到:
相关推荐
这样,在同一时刻只有一个线程能够进入该方法执行,从而避免了多个线程同时使用相同`key`而导致的结果混乱问题。 综上所述,这三个题目分别考察了应聘者对于多线程基本概念、同步机制以及并发编程的理解与应用能力...
它使用 Monitor 对象内部,确保同一时间只有一个线程执行锁定代码块。 2. **HTTP通信**: - **HttpClient类**:在C#中,HttpClient类是进行HTTP通信的标准工具,可以用来发送GET、POST等各种HTTP请求。创建...
- **线程**:是进程中的一个执行单元,一个进程中可以包含多个线程,这些线程共享同一个进程的内存资源。 - **多任务与多线程**: - 多任务是指操作系统能够同时处理多个任务的能力,而多线程则是实现多任务的一...
在开发基于Qt的应用程序时,经常会遇到需要使用多线程来进行SQLite数据库操作的情况。然而,多线程环境下的数据库操作相较于单线程来说更为复杂,需要特别注意一些细节问题,以确保程序的稳定性和效率。本文将总结在...
总之,这个资料集合为C#开发者提供了一个全面的多线程学习路径,无论你是初学者还是经验丰富的开发者,都可以从中获取宝贵的实战经验和理论知识,进一步提升你的多线程编程技能。通过深入理解并熟练运用这些概念和...
`ConcurrentBag<T>` 是一个线程安全的集合,用于存储任意数量的元素,它实现了可变大小的多生产者、多消费者队列。这个类适用于需要快速添加和删除元素的场景,尤其是当元素的顺序不是特别重要的时候。`...
1. 使用`Vector`:虽然它是线程安全的,但由于每个操作都进行同步,其性能通常低于非线程安全的集合,因此不推荐在性能要求高的场景中使用。 2. 使用`Collections.synchronizedList`:这个静态方法可以将给定的`...
本文将基于一个具体的Java多线程操作数据库的应用程序,深入探讨其背后的原理、实现细节以及潜在的挑战。 #### 核心知识点: 1. **多线程基础**:多线程是Java编程中的一个重要概念,允许程序同时执行多个任务。在...
在C#编程中,多线程环境下的数据操作是一个复杂且需要谨慎处理的领域。本文将深入探讨在多线程环境中使用List时遇到的非线程安全问题,并提供相应的解决方案和最佳实践。 List是.NET框架中常用的一个动态数组,它...
多线程是指一个程序内同时执行多个独立的线程,每个线程都有自己的执行序列,可以并发执行不同的任务。 在易语言中进行多线程操作,主要涉及以下几个知识点: 1. **线程创建**:在易语言中,可以通过`创建线程`...
- **基本概念**:线程是程序执行流的最小单元,一个标准的线程由线程ID、当前指令指针(PC)、寄存器集合和堆栈组成。 - **生命周期**:Java中线程的生命周期主要包括NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)...
为了解决这个问题,我们可以使用`Control.Invoke`或`Control.BeginInvoke`方法将更新UI的操作放到UI线程中执行: ```csharp if (this.InvokeRequired) { this.Invoke(new Action(() => { // 更新UI控件 label...
在这个主题中,我们将深入探讨一个多线程示例程序以及在使用多线程时可能遇到的常见问题。 首先,我们来看标题中提到的"一个多线程示例程序"。在C++Builder中,创建多线程通常涉及使用`TThread`类,这是VCL(Visual...
- **线程安全的集合**:在多线程环境中,可以考虑使用线程安全的集合类(如 `ConcurrentBag<T>` 或 `ConcurrentQueue<T>`),以减少锁的竞争并提高性能。 - **异步编程模型**:除了多线程外,还可以使用 C# 中的异步...
本文将探讨一个在实际项目中遇到的线程问题,并基于提供的"reflect"标签,我们来深入理解Java中的反射(Reflection)如何与线程交互,以及它可能引发的问题。 线程问题通常涉及到竞态条件、死锁、资源争抢等。在...
2. **线程同步**:为了防止多线程环境下数据的不一致,Java提供了synchronized关键字,可以保证同一时刻只有一个线程访问同步代码块。此外,还有wait()、notify()和notifyAll()方法用于线程间通信。 3. **线程池**...
这两个线程共享一个数组A,写线程对数组分别进行10次写操作,每次写操作对A的每个元素赋一个相同的值;读线程对数组分别进行10次读操作,每次读操作输出A中所有元素的值。写出相应代码,并分析运行结果。修改代码,使...
在Android中,如果多个线程同时尝试对同一个SQLite数据库进行读写操作,就可能导致这种锁定情况。 为了解决这个问题,我们可以采取以下策略: 1. **使用SQLiteOpenHelper的子类**:创建一个自定义的...