`
zenghuiss
  • 浏览: 26025 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

线程同步结束小例

    博客分类:
  • Java
 
阅读更多
随手记两个线程同步结束的例子

1.用Callable<V>
public class CallableThread implements Callable<Integer> {
	@Override
	public Integer call() throws Exception {
		DateTime dt1 = DateTime.now();
		String name = Thread.currentThread().getName();
		System.out.println(name + " start on " + dt1) ;
		Thread.sleep(new Random().nextInt(10) * 1000);
		DateTime dt2 = DateTime.now();
		Integer cost =  (int) ((dt2.getMillis() - dt1.getMillis()) / 1000);
		System.out.println(name + " end on " + dt2 + " cost time : "  + cost);
		return cost;
	}
	
	
	public static void main(String[] args) {
		List<Future<Integer>> count = Lists.newArrayList();
		ExecutorCompletionService<Integer> service = new ExecutorCompletionService<Integer>(Executors.newFixedThreadPool(5));  
		for(int i=0; i< 5; i++) {
			count.add(service.submit(new CallableThread()));
		}
		Integer total = 0;
		try {
			for(int i=0; i<count.size(); i++) {
				Future<Integer> f;
				f = service.take();
				total += f.get();
			}
		} catch (InterruptedException | ExecutionException e) {
			e.printStackTrace();
		}
		System.out.println("total cost:" + total + " aver cost " + total/count.size());
	}
}


2.用CountDownLatch(CyclicBarrier也可以达成一样的效果,写法大同小异)
public class CountDownLatchDemo implements Runnable {
	CountDownLatch latch;
	static final Map<String,Long> count = Maps.newConcurrentMap();
	ThreadDemo(CountDownLatch latch ){
		this.latch = latch;
	}

	public void run() {
		DateTime dt1 = DateTime.now();
		String name = Thread.currentThread().getName();
		System.out.println(name + " start on " + dt1);
		try {
			Thread.sleep(new Random().nextInt(10) * 1000);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		
		DateTime dt2 = DateTime.now();
		Long cost = dt2.getMillis() - dt1.getMillis();
		System.out.println(name + " end on " + dt2 + " cost time : "  + cost);
		count.put(name, cost);
		latch.countDown();
	}
	
	public static void main(String args[]) throws Exception {
		CountDownLatch latch = new CountDownLatch(5);
		ExecutorService service = Executors.newFixedThreadPool(5);  
		for (int i = 0; i < 5; i++) {
			service.execute(new ThreadDemo(latch));
		}
		latch.await();
		Long total = 0L;
		System.out.println(count);
		for(Map.Entry<String, Long> s: count.entrySet()){
			total += s.getValue();
		}
		System.out.println("all threads ended, " + " average cost is " + total
				/ count.size());
	}
}

分享到:
评论

相关推荐

    c# 多线程任务中结束全部线程

    总结来说,C#中的多线程编程涉及到线程的创建、委托的使用以及线程间的通信和同步。通过合理地利用这些特性,开发人员可以构建出既高效又稳定的多线程应用程序。在处理多线程任务时,特别需要注意的是线程安全性和...

    C# 如何挂起线程、休眠线程和终止线程(源码例)

    终止线程是指强制结束线程的执行,使其不再继续运行。在C#中,直接使用`Thread.Abort()`方法可以尝试终止线程。然而,这是一个非常危险的操作,因为线程可能在被终止时正在执行清理工作,如释放资源。因此,除非你...

    通过线程控制随机数产生与结束

    4. 线程同步与控制:`Semaphore`或其他同步工具的使用。 5. 随机数生成:`Random`类的使用。 6. 循环控制逻辑:根据条件判断是否终止循环。 通过对这个Demo的学习,开发者可以提升自己在Android中进行多线程编程的...

    多线程 定时器 同步 LINUX

    // 等待子线程结束 return 0; } ``` 二、定时器 定时器用于设置一个在未来特定时间点触发的事件。在C++中,我们可以使用标准库中的`&lt;chrono&gt;`和`&lt;future&gt;`来实现简单的定时器功能。以下是一个简单的定时器示例: ...

    Demo_多线程例_

    `AutoResetEvent`, `ManualResetEvent`, `CountdownEvent`等是线程同步事件,它们提供了一种等待线程完成特定操作或信号的方法。 9. **异步编程** 使用`async/await`关键字进行异步编程,可以避免阻塞主线程,...

    VB6 多线程案例,测试可用。

    3. **线程同步**:虽然多线程提高了并发性,但也会引入数据竞争问题。在VB6中,可能使用`Mutex`(互斥量)或`CriticalSection`来确保在特定时刻只有一个线程访问共享资源,防止数据不一致。 4. **事件驱动编程**:...

    MFC多线程编程10例

    多线程编程虽然能够提高程序的响应性和效率,但也增加了代码的复杂性,包括线程同步、竞态条件、死锁等问题。因此,开发者需要谨慎处理线程间的交互,确保数据的一致性和完整性。 在MFC多线程10例教程中,每个例子...

    多线程编程10例源码

    2. **线程同步**:多线程间的同步是防止数据竞争和确保线程安全的关键。Windows API提供了多种同步机制,如临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)和事件对象(Event)。这些同步工具...

    进程与线程开发20例

    2. **线程同步**:在线程编程中,我们常常需要同步线程操作,防止数据不一致。`std::mutex`提供了互斥锁,`std::condition_variable`用于线程间的条件等待。 3. **线程池**:线程池是一种有效的线程管理机制,可以...

    易语言 API线程等待

    API线程等待,通常涉及到Windows API中的线程同步函数,如`WaitForSingleObject`和`WaitForMultipleObjects`。这些函数允许一个线程暂停执行,直到指定的线程、事件、信号量等对象的状态改变。例如,当一个线程调用`...

    Visual_C++利用互斥量同步线程实现文件读取进度条

    为了更高效地管理文件读取与进度更新过程,本篇文章将介绍如何利用线程同步技术中的互斥量(mutex)来实现这一功能。 #### 二、线程与进程基础知识 - **进程**:一个正在执行的应用程序及其资源集合,包括私有的虚拟...

    多线程实例,线程实例

    2. 线程同步:使用synchronized关键字实现,防止多个线程同时访问同一块代码,避免数据不一致。 3. 守护线程(Daemon Thread):用于后台服务,当所有非守护线程结束时,程序会自动结束。 五、实际应用实例 在实际...

    JAVA100例之实例60 继承Thread实现多线程

    - **不要直接调用`run()`方法**:如果你直接调用`run()`方法,代码将不会在新的线程中执行,而是与`main`线程同步执行,失去了多线程的意义。 - **线程安全**:当多个线程访问共享数据时,可能会出现竞态条件(race ...

    vc中获取一个线程的状态及返回值

    4. **线程同步**: - 为了确保线程安全,通常需要使用同步机制,如互斥量(`Mutex`)、信号量(`Semaphore`)、事件对象(`Event`)等。 - 在本例中,可能使用了事件对象来协调判断线程和工作线程之间的交互,例如...

    c#多线程顺序打印1-100数字-源码.rar

    在多线程环境下实现顺序打印看似简单,实则涉及到线程同步和控制的问题,这通常通过各种同步原语来实现。在这个例子中,开发者使用了`AutoResetEvent`这一线程同步工具。 `AutoResetEvent`是.NET Framework提供的一...

    C#队列Queue多线程用法实例

    在本例中,由于只有一个线程在处理队列,因此没有明确的线程同步需求。但在实际应用中,如果多个线程可能同时操作队列,就需要添加同步机制以避免数据竞争和不一致。 此外,为了保证程序的正常退出,我们把新线程...

    三个C#线程的例子三个C#线程的例子三个C#线程的例子

    总结来说,C#提供了丰富的线程管理和同步机制,通过后台线程、线程同步以及异步编程,开发者能够构建高效、稳定且响应迅速的应用程序。理解和熟练运用这些技术对于编写多线程和并发程序至关重要。

    多线程中常用函数

    `pthread_mutex_lock`和`pthread_mutex_unlock`是用于线程同步的重要工具,它们管理互斥锁。在本例中,`mut`是一个全局的互斥锁,用于保护共享资源`number`。当线程想要修改`number`时,它会先尝试获取锁(`pthread_...

    C#多线程 C#多线程

    在`Main`方法中,创建了`FibonacciCalculations`个斐波纳契对象,并为每个对象分配一个`ManualResetEvent`,用于同步线程。然后,使用`ThreadPool.QueueUserWorkItem`方法将`ThreadPoolCallback`方法放入线程池中...

Global site tag (gtag.js) - Google Analytics