同步工具类包括信号量(Semaphore)、栅栏(barrier)、闭锁(CountDownLatch)
闭锁(CountDownLatch)
public class RunMain { public long timeTasks(int nThreads, final Runnable task) throws InterruptedException { final CountDownLatch startGate = new CountDownLatch(1); final CountDownLatch endGate = new CountDownLatch(nThreads); for (int i = 0; i < nThreads; i++) { Thread t = new Thread() { public void run() { try { startGate.await(); try { task.run(); } finally { endGate.countDown(); } } catch (InterruptedException e) { e.printStackTrace(); } }; }; t.start(); } long start = System.nanoTime(); startGate.countDown(); endGate.await(); long end = System.nanoTime(); return end - start; } }
FutrureTask
FutureTask也可以做闭锁,FutureTask表示的计算是通过Callable来实现的,相当于一种可生成结果的Runnable,并且可以处于一下3中状态
- 等待运行
- 正在运行
- 运行完成:表示计算的所有可能结束方式包括正常结束、由于取消而结束和由于异常而结束等。当FutureTask进入完成状态后,它会永远停止在这个状态上。
Future.get的行为取决于任务的状态,如果任务已经完成,那么get会立即返回结果,否则将阻塞知道完成状态,然后返回结果或者抛出异常。FutureTask将计算结果从执行计算的线程传递到获取这个结果的线程,而FutureTask的规范确保了这种传递过程能实现结果的安全发布。
public class RunMain { private FutureTask<String> future = new FutureTask<String>(new Callable<String>() { public String call() throws Exception { System.err.println("数据加载中"); Thread.sleep(3000); return "数据加载完成"; }; }); private Thread thread = new Thread(future); public void start() { thread.start(); } public String get() throws InterruptedException, ExecutionException { return future.get(); } public static void main(String[] args) throws InterruptedException, ExecutionException{ RunMain run = new RunMain(); run.start(); System.out.println(run.get()); } }
信号量(Semaphore)
计数信号量用来控制同时访问某个特定资源的操作数量,或者同时执行某个制定操作的数量,计数信号量还可以用来实现某种资源池或者对容器施加边界
public class RunMain<T> { private Set<T> set; private Semaphore sem; public RunMain(int bound) { set = Collections.unmodifiableSet(new HashSet<T>()); sem = new Semaphore(bound); } public boolean add(T t) throws InterruptedException { sem.acquire(); boolean boo = false; try { boo = set.add(t); return boo; } finally { if (!boo) sem.release(); } } public boolean remove(T t) { boolean boo = set.remove(t); if (boo) sem.release(); return boo; } }
栅栏(barrier)
所有线程必须同时到达栅栏的位置,才能继续执行,闭锁用于等待事件,而栅栏用于等待其他线程。
CyclicBarrier可以使一定数量的参与方反复地在栅栏位置聚集,它在并行迭代算法中非常有用。
代码摘自:http://www.cnblogs.com/dolphin0520/p/3920397.html
public class Test { public static void main(String[] args) { int N = 4; CyclicBarrier barrier = new CyclicBarrier(N,new Runnable() { @Override public void run() { System.out.println("当前线程"+Thread.currentThread().getName()); } }); for(int i=0;i<N;i++) new Writer(barrier).start(); } static class Writer extends Thread{ private CyclicBarrier cyclicBarrier; public Writer(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } @Override public void run() { System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据..."); try { Thread.sleep(5000); //以睡眠来模拟写入数据操作 System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); }catch(BrokenBarrierException e){ e.printStackTrace(); } System.out.println("所有线程写入完毕,继续处理其他任务..."); } } }
相关推荐
5. 可能还包含其他辅助方法,如线程同步、线程池管理或异常处理机制。 理解并熟练运用这样的线程管理工具类,有助于提升Java应用的并发性能和稳定性,同时降低代码的复杂性。在实际开发中,我们应根据项目需求选择...
在VC++编程环境中,线程同步是一个至关重要的概念,特别是在多线程程序设计中,以确保并发执行的线程能够安全地访问共享资源,避免数据竞争和其他潜在的问题。本篇文章将详细探讨线程锁在VC++中的应用,以及如何通过...
- **CountDownLatch, CyclicBarrier, Semaphore**:线程同步工具类,用于控制线程的并发数量和同步。 7. **线程池**: - **ThreadPoolExecutor**:自定义线程池,可根据需求设置核心线程数、最大线程数、线程存活...
2. **线程同步**: - **CSemaphore**:此类代表信号量,用于限制同时访问资源的线程数量。当线程需要访问共享资源时,会尝试获取信号量。如果当前信号量计数值大于零,线程可继续执行;否则,线程将被阻塞,直到...
然而,多线程环境下也带来了一些问题,尤其是资源竞争和数据一致性问题,这些问题需要通过线程同步机制来解决。本文将详细介绍如何通过临界区、互斥内核对象、事件内核对象和信号量内核对象来实现线程同步。 1. ...
"多线程的批量线程同步解决方案"这个标题暗示我们探讨的是如何在多线程环境下有效地管理和同步多个任务,确保数据一致性与程序正确性。下面将详细阐述相关知识点。 一、多线程基础 多线程是指在一个进程中同时执行...
本主题将深入探讨如何使用`CMutex`类来实现线程同步,该类是Microsoft MFC(Microsoft Foundation Classes)库中的一个组件,专门用于处理线程间的互斥访问。 首先,线程同步是为了防止多个线程同时访问同一资源,...
线程同步就是为了解决这类问题,它确保在特定时间内只有一个线程能够访问共享资源,从而保证程序的正确性和一致性。 二、C#中的线程同步机制 1. **Monitor**:C#的`lock`关键字背后使用的就是`Monitor`类,它可以...
总的来说,`CountDownLatch` 是一种有效的同步工具,尤其适用于那些需要等待一组线程全部完成后再执行后续操作的场景。在实际开发中,结合 `ExecutorService` 和 `Future`,我们可以构建更复杂的并发控制策略,以...
本篇文章将详细探讨`AutoResetEvent`这一线程同步工具,并通过一个DEMO来展示其在实际中的应用。 `AutoResetEvent`是.NET框架提供的一个线程同步类,属于信号量类型的同步原语。它的主要作用是在线程间提供一种通信...
线程同步是多线程编程中的重要概念,用于协调多个并发执行的线程,确保它们在访问共享资源时不会产生竞态条件或数据不一致性。在Windows编程中,提供了多种线程同步机制,包括互斥量、临界区、原子操作、事件以及...
本篇文章将深入探讨三种在C++中实现多线程同步的方法:事件对象、关键代码段和互斥对象。 首先,我们来看**事件对象**。事件对象是一种信号机制,用于线程间通信和同步。在Windows API中,CreateEvent函数创建一个...
在JNI中,我们可以使用C/C++的原生线程同步工具,如互斥量(mutex)、条件变量(condition variable)、信号量(semaphore)等。例如,可以使用pthread_mutex_lock和pthread_mutex_unlock来实现互斥锁,确保同一...
总之,iOS中的线程同步方案多种多样,开发者需要根据实际需求选择合适的工具来确保线程安全。理解并熟练掌握这些技术,对于编写高效、稳定的多线程代码至关重要。在实际应用中,合理地结合使用这些同步机制,能够...
互斥量是一种跨进程的线程同步工具,它可以确保同一时间只有一个线程能拥有对资源的访问权。当一个线程获得了互斥量的所有权后,其他试图获取该所有权的线程将被阻塞,直到该线程释放互斥量。在Windows中,可以使用...
系统内核对象是.NET中更底层的同步工具,包括互斥体(Mutex)、信号量(Semaphore)和事件(AutoResetEvent/ManualResetEvent)。互斥体确保同一时刻只有一个线程访问资源,而信号量可以控制同时访问资源的线程数量。事件...
MFC中的CCriticalSection类是实现临界区的工具,它比互斥锁更轻量级,适用于单进程内的线程同步。 在实际应用中,开发者需要根据具体需求选择合适的同步机制。例如,信号量适合管理有限数量的资源,互斥锁适用于...
操作系统实验 线程同步机制 Nachos 操作系统实验报告中,主要实现了锁机制和条件变量,并利用这些同步机制实现几个基础工具类。下面是该实验报告的详细知识点: 一、锁机制 锁机制是操作系统中最基本的同步机制...
综上所述,线程同步是多线程编程的核心,通过互斥量、条件变量、信号量、死锁避免策略以及文件锁等工具,我们可以有效地管理和协调并发线程,确保程序的正确性和高效性。理解并熟练应用这些概念,对于开发稳定、高效...