自己的一个线程同步通讯的实例

原创 2007年09月28日 16:24:00

    在实际工作中,经常遇到在一个多步作业中由于某一步的瓶颈而制约整个作业步骤的情况,要使性能改善,我们需要发挥多线程集中

处理的作用,把较为容易的步骤先作运行产生批量数据,再交给新线程来集中处理较难的一步,这样就节省了略小于(m-1)*N的宝贵时间

。但同时,问题又出现,因为作业本是存在先后顺序的流水式,变为多个子母式并发线程,线程间的同步通信成为了需要解决的一个问题

,好在Java线程中提供了这样的一种机制,下面就通过一个实例谈谈这方面的注意事项。
在本例中,用Thread.sleep(ms)来代替具体的业务过程,整个作业分为三步:step1、step2、step3,后面将通过打印的结果讨论对性能是

否有所改善。
主调度线程:
public class Main extends Thread{
  
   public static void main(String[] args){
       PartTwo part2 = new PartTwo();
       PartOne part1 = new PartOne(part2);
       part1.start();
       part2.start();
   }
}

//---------------------------------处理简单的步骤step1、step2------------------------------------
public class PartOne extends Thread{
    private String[] docIds = new String[100];
    private PartTwo part2;
   
    public PartOne(PartTwo p2){
        this.part2 = p2;
    }
   
    public void run(){
        while (true){
            long curTime = System.currentTimeMillis();
            step1();
            step3();
            System.out.println("spend time:"+(System.currentTimeMillis()-curTime));
        }
    }
   
    public void step1(){
        long curTime = System.currentTimeMillis();
        for (int i=0; i<100; i++){
            docIds[i] = String.valueOf(i);
            try{
                sleep(100);
            }catch(InterruptedException ie){
                ie.printStackTrace();
            }
        }
        System.out.println("step1.."+(System.currentTimeMillis()-curTime));
        synchronized (part2){
            part2.notifyAll();
        }
    }
   
    public void step3(){
        long curTime = System.currentTimeMillis();
        synchronized (part2.finishSem){
            try{
                part2.finishSem.wait();
            }catch(InterruptedException ie){
                ie.printStackTrace();
            }
        }
        if (!part2.getStatus()){
            System.out.println("step2 fail...");
        }else{
            for (int i=0; i<100; i++){
                try{
                    sleep(20);
                }catch(InterruptedException ie){
                    ie.printStackTrace();
                }
            }
        }
        System.out.println("step3..."+(System.currentTimeMillis()-curTime));
    }
}

//---------------------集中式处理的线程----------------------------
public class PartTwo extends Thread{
   public Object finishSem = new Object();
   private boolean status;
  
   public PartTwo(){
   }
  
   public void run(){
       while (true){
           dosome();
       }
   }
  
   public void dosome(){
       long curTime = System.currentTimeMillis();
       try{
           synchronized (this){
               wait();
           }
           sleep(5000);  //dosomething
           System.out.println("step2...."+(System.currentTimeMillis()-curTime));
           synchronized (finishSem){
               status = true;
               finishSem.notifyAll();
           }
       }catch(InterruptedException ie){
           status = false;
           ie.printStackTrace();
       }
   }
  
   public boolean getStatus(){
       return this.status;
   }
  
}


结论:如果采用流水式作业,T(step1)=10 ms, T(step2)=4000 ms, T(step3)=20 ms, 那么100个任务所需要的时间是:T=100*

(10+4000+20)= 403,000 ms.
在比较实际运行的结果:
step1..10047
step2....15047
step3...7062
spend time:17109
节省的时间为:403000/17109≈23.55倍。
集中式处理后,三个步骤的运行时间图如下:
step1 |======>|
step2 |-------======>|
        step3 |------=======>|
Thread技术方面的总结:
wait():使当前线程陷于等待状态,并释放占用的资源,直至另外的线程将它唤醒。
notifyAll():唤醒请求而未分配到该资源的线程,通知它可以运行。
*注:这两个方法都必须在资源同步的状态下才能使用(synchronized),否则会抛出异常。
*一旦主调线程notifyAll,就意味着同时启动了一个等待该资源的线程,而不管主调线程是否已结束。
*在synchronized块中,notifyAll之前,不允许改变向量的值。 

《线程》——多线程同步实例剖析

线程这个名词我们在学习操作系统的时候就接触过了,线程又称为轻量级进程,那进程是什么哪?大家可以跟随我的超链接看一下百度百科的解释。      简单线程实例,解决两个售票窗口售票问题。      具体的...
  • u013067402
  • u013067402
  • 2016年02月15日 08:16
  • 1497

线程同步和异步 实例(一)

using System; using System.Collections.Generic; using System.Linq; using System.Text; /* * 同步方...
  • jack15850798154
  • jack15850798154
  • 2011年09月08日 09:08
  • 1463

线程同步异步实例分析

我的理解: 同步就是顺序执行。 异步就是可以并行执行。 多线程是实现异步操作的一种手段或方式...
  • fangqun663775
  • fangqun663775
  • 2015年06月12日 11:16
  • 604

一个简易的线程同步实例

通过这几次不同的输出可以看出线程同步时布尔表达式的判断是对所有同步的线程都有效的,而这也就是线程同步的作用之一——上下文关联了。...
  • number1killer
  • number1killer
  • 2018年01月19日 13:44
  • 38

java实现最简单socket通讯

一.服务器public class HServerApp implements Runnable { public int port; public HServerApp(int por...
  • hspingcc
  • hspingcc
  • 2017年01月13日 16:07
  • 1260

C++线程同步方式及例子

C++线程同步方式及例子
  • daoming1112
  • daoming1112
  • 2017年01月24日 22:07
  • 429

XMPP通讯过程-简单实例

版权所有,转载请注明出处:http://guangboo.org/2013/02/25/xmpp-communication-implement-with-xmpppy 上一篇文章《XMPP通讯过程...
  • guangboo
  • guangboo
  • 2013年02月25日 18:31
  • 1183

Java多线程之线程安全与同步实例

1.1    线程安全与同步实例 1.1.1  购票同步对象锁 【 /*  * 用程序模拟铁路售票系统:实现通过两个售票点发售某日某次列车的50张车票,  * 一个售票点用一个线程表示  ...
  • JourneyX
  • JourneyX
  • 2016年10月29日 20:47
  • 3395

C++ 之 经典线程同步案例之多线程(五)

首先在此感谢 MoreWindows 秒杀多线程面试题系列让我成长和学习,同时也借鉴了很多优秀观点和示例! 在此也借鉴MoreWindows案例加以说明:   程序描述: 主线程启动10个子线程并将...
  • u010236550
  • u010236550
  • 2013年12月18日 15:32
  • 1419

线程同步的小例子

// example.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include usin...
  • qingzai_
  • qingzai_
  • 2016年06月21日 23:45
  • 537
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己的一个线程同步通讯的实例
举报原因:
原因补充:

(最多只允许输入30个字)