`
macheng365
  • 浏览: 28032 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

让子线程执行完后再执行主线程的列子

阅读更多

该列子的作用是:想让两个子线程分别执行完成后再执行main线程。

package org.demo.temp;

/**
 * 线程同步测试
 * @author  
 * @date    2010-12-5
 * @file    org.demo.tmp.Test.java
 */
public class Test1 {

    /**
     * @param args
     */
    public static void main(String[] args)throws Exception {
        // 参数3是对三个子线程执行完毕的计数器,在run方法中进行扣减  
       CountDown count = new CountDown(3);
        Task1 t1 = new Task1(count);
        Task1 t2 = new Task1(count);
        Task1 t3 = new Task1(count);
        /* init thread and start */
        new Thread(t1, "Thread one").start();
        new Thread(t2, "Thread two").start();
        new Thread(t3, "Thread three").start();
        /* wait all threads done */
        synchronized (count) {
            count.wait();
        }
        /* print the result */
        int result = t1.getTotal() + t2.getTotal() + t3.getTotal();
        System.out.println(">> result = " + result);
        System.out.println(">>count.value = " +count.getValue());
    }
}
/**
 * 用来计数的类
 * @author 
 */
class CountDown {
    /* count */
    private int count;
    
    public CountDown(int value){
        this.count = value;
    }
    
    public void sub(int number){
        count -= number;
    }
    
    public int getValue(){
        return count;
    }
}
/**
 * 线程需要执行的任务
 * @author 
 */
class Task1 implements Runnable{
    
    /* total */
    private int total = 0;
    
    /* count */
    private CountDown count;
    
    /**
     * constructor
     * @param count
     */
    public Task1(CountDown count){
        this.count = count;
    }
    
    public void run() {
        int sum = 0;
        for (int i=1; i<=100; i++){
            sum += i;
        }
        this.total = sum;
        System.out.println(Thread.currentThread().getName() + " done.");
        synchronized (count) {
            count.sub(1);
            if (count.getValue() <= 0){
                count.notify();
            }
        }       
    }
    /**
     * get total value
     * @return
     */
    public int getTotal(){
        return total;
    }
}

 

分享到:
评论

相关推荐

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

    其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿。 那么怎么让子线程去做主线程的事儿呢,我们只需要把主线程的方法传递给子线程就行了,那么传递方法就...

    QTimer在子线程里执行例子

    QTimer在子线程里执行例子,代码简单,调试方便 vs2008

    android开发教程之子线程中更新界面

    在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于...

    VB6.0 多线程相关例子.rar

    vb实现多线程 主线程执行结果测试,运行时先点“开始执行”然后结束点“结束”记得退出时一定要先点结束。代码中已定义了用于多线程访问临界资源同步Api的数据结构,请注意;createThread APi声明已被我修改过,修改...

    c# winform多线程的小例子

    为了方便后面的描述,我把UI线程称作主线程,把执行累加计算的线程称作工作者线程。该过程有两个关键点: 1:如何在工作者线程中访问主线程创建的控件; 2:如何取消比较耗时的计算; 为了便于在工作者线程中调用...

    c# winform异步不卡界面的实现方法

    子线程的计算结果 要更新到界面中,怎么更新呢,因为不能操作主线程 ,所以要用委托来实现 。 我们来看个例子。 场景 界面上一个按钮加一人richbox , 点击以后获得当前所在年份 代码实现 定义一个委托实现子线程...

    linux系统编程之线程.zip

    由于从main函数return也相当于调用exit,为了防止新创建的线程还没有得到执行就终止,我们在main函数return之前延时1秒,这只是一种权宜之计,即使主线程等待1秒,内核也不一定会调度新创建的线程执行,下一节我们会...

    Java线程之join_动力节点Java学院整理

    join() 定义在Thread.java中。 join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。这句话可能有点晦涩,我们还是通过例子去理解

    asyncio-executor:协程执行器,起一个额外的线程执行事件循环,主线程则管理这个事件循环线程, 这个执行器不要用在协程中

    &gt; 关键字:asyncio,执行器特征异步运行协程例子通过使用提交运行协程from concurrent . futures import as_completedimport aiohttpfrom asyncio_executor import AsyncioExecutorasync def httpget ( url ): ...

    多线程的使用例子,自动指派CPU核心+定时信息框的使用-易语言

    例子中多数命令都做了详细注释,包括常量也尽量进行了解释,...温馨提示:因为是满载模式工作,所以开始工作后你会发现电脑变卡,CPU占用99%,因为所有CPU都被抢占了,如果要避免请修改线程执行的子程序内的代码!!!

    Android 演示Socket通信的例子 包括了服务器端代码.rar

    Android 演示Socket通信的例子 包括了服务器端、客户端代码,以及测试的主程序。在本实例中,演示了采用两种方法实现添加线程,演示了Socket通信的建立方法,在...控件的设置不能在子线程中操作,需要在主线程中。

    java多线程机制 -- 源码详解

    在上述例子中,我们在main主线程中创建了两个新的线程lefthand和righthand。当lefthand调用start()开始运行时,类Lefthand中的run()将自动被执行。 我们来分析一下上面程序的输出结果。Left线程首先开始执行,这时...

    js Worker 线程1

    js Worker 线程 在平时的运行的javascript脚本都在主线程中执行,如果当前脚本包含复杂的、耗时的代码。例子: 假设程序需要计算、收集1

    浅谈Python中threading join和setDaemon用法及区别说明

    1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。...

    异步调用实例01-EndInvoke-c#

    异步执行方法的最简单的方式是通过调用委托的BeginInvoke方法来开始执行方法,在主线程上执行一些工作,然后调用委托的EndInvoke方法。EndInvoke可能会阻止调用线程,因为它直到异步调用完成之后才返回。这种技术...

    Java抢火车票程序源码-multithread:多线程

    一个进程运行至少有一个线程在运行,通常说的主线程,那么在Java中如何创建一个线程呢?有两种方法,一继承Thread类,二实现Runnable接口,区别是类只能单继承,接口可以无限。 注意一点:多线程是异步,代码的执行...

    fiber-framework:用户空间线程(即纤程)的跨平台框架

    与事件驱动模型相比,纤程框架允许保持主线程模型的优势 - 线性执行流,与事件驱动的执行流相比,它更易于编程和理解(有任务,自然适合事件驱动模型- 例如,GUI 应用程序。不要为这些任务使用光纤框架

    易语言真正的线程池简易实现例子-易语言

    1.通过一个主线程来监视是否有新任务,如果有新任务,则判断当前的线程数是否大于最大线程数,如果小于最大线程数则创建新线程,反之则加入线程队列等待执行。 2.当时间经过过长(1 分钟,可手动设置)主线程会自动...

    针对HTML5的Web Worker使用攻略

     Web Worker的基本原理就是在当前javascript的主线程中,使用Worker类加载一个javascript文件来开辟一个新的线程,起到互不阻塞执行的效果,并且提供主线程和新线程之间数据交换的接口:postMessage,onmessage。...

Global site tag (gtag.js) - Google Analytics