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中异步线程调用主线程会报错,所以编写了一个Loom
为了解决这个问题,我们可以利用Qt提供的多线程机制,将耗时操作转移到子线程执行,以确保主线程能够保持对UI的及时更新。以下将详细讲解如何在Qt中使用多线程防止界面假死,并给出一种有效的方法。 1. Qt中的线程...
`ExecutorService`是一个线程池服务,可以管理多个线程,而`Future`则用于获取异步任务的结果。 例如,下面是一个简单的异步调用示例: ```java import java.util.concurrent.*; public class Main { public ...
在C#编程中,多线程是常见的并发执行方式,其中主线程通常负责应用程序的主逻辑,而子线程则可以执行一些独立的任务。当子线程完成其工作后,有时需要通知主线程以便进行下一步操作。本文将详细介绍如何在C#中实现...
在多线程编程中,尤其是使用VC++进行开发时,如何有效地从子线程更新主线程的数据是一个重要的问题。这涉及到线程间通信(Thread Communication)的概念,它确保了不同线程之间的协作和数据同步。在Windows环境中,...
此外,`CountDownLatch`是另一种常用于同步多个线程的工具,它可以计数线程的完成情况。当计数到达零时,所有等待的线程都会被释放。`CyclicBarrier`则允许一组线程等待其他线程到达一个公共屏障点,而`Semaphore`则...
这个工程的目的是让主线程能持续快速地进行轮询,同时多个子线程可以并行处理耗时的任务,从而优化整体系统性能。 一、多线程技术 在Labview中,多线程允许程序同时执行多个独立的任务。这可以通过创建并运行多个VI...
在C# Winform应用开发中,主线程与子线程的协同工作是一项核心技能,尤其在处理耗时操作,如数据库查询、网络通信等时,更显得至关重要。本主题聚焦于如何利用“异步委托”在主线程中显示数据,同时在子线程中获取...
在"pb多线程源码及思路"的描述中提到,主线程启动一个子线程,然后子线程又可以反过来调用主线程。这种交互方式展示了线程之间的相互作用。在PowerBuilder中,可以通过事件和方法调用来实现这种交互。主线程设置两个...
本示例"android 主线程给子线程发送消息"是通过`Handler`机制来实现通信的,这是一个关键的多线程同步技术。 `Handler`是Android中用于在线程间传递消息和调度任务的工具,尤其是主线程与工作线程之间的通信。下面...
总结来说,正确地从子线程更新主线程数据是多线程编程的关键。使用`Invoke`或`BeginInvoke`(以及WPF中的`Dispatcher`)可以确保在正确的线程上下文中执行UI更新,避免线程不安全的操作。了解这些概念和方法对于构建...
"主线程等待子多线程(无结果返回)执行完成再继续执行"这个主题就涉及到如何在Java、C#、Python等编程语言中实现这种同步机制。下面将详细讨论这个知识点。 **1. Java中的`Thread.join()`方法** 在Java中,主线程...
`CountDownLatch`允许一个或多个线程等待其他线程完成操作。初始化`CountDownLatch`时指定计数器的值,每次调用`countDown()`方法时减少计数器的值,当计数器到达零时,所有因`await()`方法而阻塞的线程将被唤醒。 ...
每个进程可以包含多个线程。 ### iOS线程管理 #### 线程同步与互斥 - **线程锁(`NSLock`)**: 用于保护共享资源不被同时访问,确保数据的一致性。示例代码中定义了一个`NSLock`类型的属性`lock`,用于保护对`...
综上所述,这个项目展示了如何在Qt环境下使用串口通信和多线程技术实现一个高效、稳定的应用程序。通过合理的设计和编程,可以构建出能够实时接收和处理串口数据的子线程,同时保持主线程的轻量和响应性。
- 使用`QMetaObject::invokeMethod()`:在子线程中调用主线程对象的方法,确保操作在正确的线程中执行。 - `QApplication::postEvent()`:向主线程的事件队列中添加事件,事件处理器将在主线程中运行。 5. **线程...
当多个线程共享同一资源时,数据同步和安全问题就会变得至关重要。本话题聚焦于“多线程线程变量赋值”,讨论如何在不通过参数传递的情况下,为线程变量直接赋值。 首先,我们需要理解线程变量(Thread Local ...
子程序11可能是一个主线程的子程序,负责启动其他线程;而子程序1则可能是被创建的线程所执行的子程序,执行特定的任务。 五、源码分析 提供的压缩包文件“易语言多线程传递多参数源码”包含了实际的代码实现,这...
主线程作为观察者,注册到这个`Observable`对象上,当子线程发出通知时,主线程的`update()`方法会被调用,从而实现通信。 4. **示例代码**:以下是一个简单的例子,演示了如何使用观察者模式来实现子线程通知主线...
总结起来,通过窗口传递来让主线程触发FIRE事件是一种常见的解决策略,它遵循了多线程编程的最佳实践,确保了线程安全和UI一致性。理解这些概念和技术对于开发高效且稳定的多线程Windows应用程序至关重要。