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

多线程 主线程调用多个子线程

    博客分类:
  • bf
 
阅读更多
package com.tristan;

import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

import com.google.common.util.concurrent.ThreadFactoryBuilder;

/**
 * http://dongxuan.iteye.com/blog/901689
 * http://dongxuan.iteye.com/blog/902571
 * @author Administrator
 *
 */
public class TestMultiThread {

	private static ThreadPoolExecutor threadPoolExecutor;
	
	static{
		threadPoolExecutor = new ThreadPoolExecutor(2, 4, 1, TimeUnit.MINUTES, 
				new ArrayBlockingQueue<Runnable>(2),
				new ThreadFactoryBuilder().setDaemon(true).setNameFormat("ExecuteEngine-%s").build());
	}
	
	public static void main(String[] args) throws Exception{
		
		final AtomicLong ai = new AtomicLong(0);
		
		int num = 4;
		for (int i = 0; i < num; i++) {
			Worker worker = new Worker(ai);
			threadPoolExecutor.execute(worker);
		}

		while(true){
			synchronized (ai) {
				if(ai.get() == num){
					break;
				}else{
					ai.wait(1000);
				}
			}
		}
		
		
		System.out.println("end " +  ai.get());
		
	}
	
	
	static class Worker implements Runnable{
		
		AtomicLong ai;
		
		public Worker(AtomicLong ai) {
			this.ai = ai;
		}
		
		@Override
		public void run() {
			Random r = new Random();
			try {
				long time = 1000 + r.nextInt(10*1000);
				System.out.println(Thread.currentThread().getName() + "  "+time);
				Thread.sleep(time);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			ai.incrementAndGet();
			
			synchronized (ai) {
				ai.notify();
			}
		}
	}
}

分享到:
评论

相关推荐

    Unity异步线程调用主线程脚本

    Unity异步线程调用主线程脚本程序,在Unity中异步线程调用主线程会报错,所以编写了一个Loom

    qt 多线程 防止主线程做循环操作导致界面假死

    为了解决这个问题,我们可以利用Qt提供的多线程机制,将耗时操作转移到子线程执行,以确保主线程能够保持对UI的及时更新。以下将详细讲解如何在Qt中使用多线程防止界面假死,并给出一种有效的方法。 1. Qt中的线程...

    Java多线程实现异步调用实例

    `ExecutorService`是一个线程池服务,可以管理多个线程,而`Future`则用于获取异步任务的结果。 例如,下面是一个简单的异步调用示例: ```java import java.util.concurrent.*; public class Main { public ...

    C#子线程执行完后通知主线程的方法

    在C#编程中,多线程是常见的并发执行方式,其中主线程通常负责应用程序的主逻辑,而子线程则可以执行一些独立的任务。当子线程完成其工作后,有时需要通知主线程以便进行下一步操作。本文将详细介绍如何在C#中实现...

    如何从子线程更新主线程数据

    在多线程编程中,尤其是使用VC++进行开发时,如何有效地从子线程更新主线程的数据是一个重要的问题。这涉及到线程间通信(Thread Communication)的概念,它确保了不同线程之间的协作和数据同步。在Windows环境中,...

    Java简单实现“主线程等待所有子线程完成再继续”

    此外,`CountDownLatch`是另一种常用于同步多个线程的工具,它可以计数线程的完成情况。当计数到达零时,所有等待的线程都会被释放。`CyclicBarrier`则允许一组线程等待其他线程到达一个公共屏障点,而`Semaphore`则...

    Labview2015多线程异步调用工程

    这个工程的目的是让主线程能持续快速地进行轮询,同时多个子线程可以并行处理耗时的任务,从而优化整体系统性能。 一、多线程技术 在Labview中,多线程允许程序同时执行多个独立的任务。这可以通过创建并运行多个VI...

    C# 主线程显示数据,子线程获取数据

    在C# Winform应用开发中,主线程与子线程的协同工作是一项核心技能,尤其在处理耗时操作,如数据库查询、网络通信等时,更显得至关重要。本主题聚焦于如何利用“异步委托”在主线程中显示数据,同时在子线程中获取...

    pb多线程(源码)及思路.zip

    在"pb多线程源码及思路"的描述中提到,主线程启动一个子线程,然后子线程又可以反过来调用主线程。这种交互方式展示了线程之间的相互作用。在PowerBuilder中,可以通过事件和方法调用来实现这种交互。主线程设置两个...

    android 主线程给子线程发送消息

    本示例"android 主线程给子线程发送消息"是通过`Handler`机制来实现通信的,这是一个关键的多线程同步技术。 `Handler`是Android中用于在线程间传递消息和调度任务的工具,尤其是主线程与工作线程之间的通信。下面...

    如何从子线程更新主线程数据实例C#.net源代码编写

    总结来说,正确地从子线程更新主线程数据是多线程编程的关键。使用`Invoke`或`BeginInvoke`(以及WPF中的`Dispatcher`)可以确保在正确的线程上下文中执行UI更新,避免线程不安全的操作。了解这些概念和方法对于构建...

    主线程等待子多线程(无结果返回)执行完成再继续执行

    "主线程等待子多线程(无结果返回)执行完成再继续执行"这个主题就涉及到如何在Java、C#、Python等编程语言中实现这种同步机制。下面将详细讨论这个知识点。 **1. Java中的`Thread.join()`方法** 在Java中,主线程...

    Java多线程--让主线程等待所有子线程执行完毕

    `CountDownLatch`允许一个或多个线程等待其他线程完成操作。初始化`CountDownLatch`时指定计数器的值,每次调用`countDown()`方法时减少计数器的值,当计数器到达零时,所有因`await()`方法而阻塞的线程将被唤醒。 ...

    有关主线程和子线程

    每个进程可以包含多个线程。 ### iOS线程管理 #### 线程同步与互斥 - **线程锁(`NSLock`)**: 用于保护共享资源不被同时访问,确保数据的一致性。示例代码中定义了一个`NSLock`类型的属性`lock`,用于保护对`...

    Qt 串口,多线程(子线程处理串口信号)

    综上所述,这个项目展示了如何在Qt环境下使用串口通信和多线程技术实现一个高效、稳定的应用程序。通过合理的设计和编程,可以构建出能够实时接收和处理串口数据的子线程,同时保持主线程的轻量和响应性。

    QT子线程更新主线程

    - 使用`QMetaObject::invokeMethod()`:在子线程中调用主线程对象的方法,确保操作在正确的线程中执行。 - `QApplication::postEvent()`:向主线程的事件队列中添加事件,事件处理器将在主线程中运行。 5. **线程...

    多线程线程变量赋值

    当多个线程共享同一资源时,数据同步和安全问题就会变得至关重要。本话题聚焦于“多线程线程变量赋值”,讨论如何在不通过参数传递的情况下,为线程变量直接赋值。 首先,我们需要理解线程变量(Thread Local ...

    易语言多线程传递多参数

    子程序11可能是一个主线程的子程序,负责启动其他线程;而子程序1则可能是被创建的线程所执行的子程序,执行特定的任务。 五、源码分析 提供的压缩包文件“易语言多线程传递多参数源码”包含了实际的代码实现,这...

    java 子线程通过观察者模式通知主线程

    主线程作为观察者,注册到这个`Observable`对象上,当子线程发出通知时,主线程的`update()`方法会被调用,从而实现通信。 4. **示例代码**:以下是一个简单的例子,演示了如何使用观察者模式来实现子线程通知主线...

    通过窗口传递让主线程触发FIRE事件(子线程不能触发)

    总结起来,通过窗口传递来让主线程触发FIRE事件是一种常见的解决策略,它遵循了多线程编程的最佳实践,确保了线程安全和UI一致性。理解这些概念和技术对于开发高效且稳定的多线程Windows应用程序至关重要。

Global site tag (gtag.js) - Google Analytics