知识大全 Java多线程实现异步调用

Posted

篇首语:书到用时方恨少,事非经过不知难。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java多线程实现异步调用相关的知识,希望对你有一定的参考价值。

Java多线程实现异步调用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在JAVA平台 实现异步调用的角色有如下三个角色:调用者 提货单 真实数据一个调用者在调用耗时操作 不能立即返回数据时 先返回一个提货单 然后在过一断时间后凭提货单来获取真正的数据 去蛋糕店买蛋糕 不需要等蛋糕做出来(假设现做要很长时间) 只需要领个提货单就可以了(去干别的事情) 等到蛋糕做好了 再拿提货单取蛋糕就可以了 public class Main public static void main(String[] args)

  System out println( main BEGIN );

  Host host = new Host();

  Data data = host request( A );

  Data data = host request( B );

  Data data = host request( C );

  System out println( main otherJob BEGIN );

  try

  Thread sleep( );

   catch (InterruptedException e)

  

  System out println( main otherJob END );

  System out println( data = + data getContent());

  System out println( data = + data getContent());

  System out println( data = + data getContent());

  System out println( main END );

  

  

  这里的main类就相当于 顾客 host就相当于 蛋糕店 顾客向 蛋糕店 定蛋糕就相当于 发请求request 返回的数据data是FutureData的实例 就相当于提货单 而不是真正的 蛋糕 在过一段时间后(sleep一段时间后) 调用data getContent() 也就是拿提货单获取执行结果

  下面来看一下 顾客定蛋糕后 蛋糕店做了什么

  public class Host

  public Data request(final int count final char c)

  System out println( request( + count + + c + ) BEGIN );

  // ( ) 建立FutureData的实体

  final FutureData future = new FutureData();

  // ( ) 为了建立RealData的实体 启动新的线程

  new Thread()

  public void run()

  //在匿名内部类中使用count future c

  RealData realdata = new RealData(count c);

  future setRealData(realdata);

  

   start();

  System out println( request( + count + + c + ) END );

  // ( ) 取回FutureData实体 作为传回值

  return future;

  

  

  host( 蛋糕店 )在接到请求后 先生成了 提货单 FutureData的实例future 然后命令 蛋糕师傅 RealData去做蛋糕 realdata相当于起个线程去做蛋糕了 然后host返回给顾客的仅仅是 提货单 future 而不是蛋糕 当蛋糕做好后 蛋糕师傅才能给对应的 提货单 蛋糕 也就是future setRealData(realdata)

  下面来看看蛋糕师傅是怎么做蛋糕的

  建立一个字符串 包含count个c字符 为了表现出犯法需要花费一些时间 使用了sleep

  public class RealData implements Data private final String content;

  public RealData(int count char c)

  System out println( making RealData( + count + + c + ) BEGIN );

  char[] buffer = new char[count];

  for (int i = ; i < count; i++)

  buffer[i] = c;

  try

  Thread sleep( );

   catch (InterruptedException e)

  

  

  System out println( making RealData( + count + + c + ) END );

  ntent = new String(buffer);

  

  public String getContent()

  return content;

  

  

  现在来看看 提货单 future是怎么与蛋糕 content 对应的:

  public class FutureData implements Data private RealData realdata = null;

  private boolean ready = false;

  public synchronized void setRealData(RealData realdata)

  if (ready)

  return; // 防止setRealData被调用两次以上

  

  this realdata = realdata;

  this ready = true;

  notifyAll();

  

  public synchronized String getContent()

  while (!ready)

  try

  wait();

   catch (InterruptedException e)

  

  

  return realdata getContent();

  

  

  顾客做完自己的事情后 会拿着自己的 提货单 来取蛋糕

  System out println( data = + data getContent());

  这时候如果蛋糕没做好 就只好等了

  while (!ready) try

  wait();

   catch (InterruptedException e)

  

  //等做好后才能取到

  return realdata getContent();

  程序分析

  对于每个请求 host都会生成一个线程 这个线程负责生成顾客需要的 蛋糕 在等待一段时间以后 如果蛋糕还没有做好 顾客还必须等待 直到 蛋糕被做好 也就是

  future setRealData(realdata); 执行以后 顾客才能拿走蛋糕

  每个线程只是专门负责制作特定顾客所需要的 蛋糕 也就是顾客A对应着蛋糕师傅A 顾客B对应着蛋糕师傅B 即使顾客B的蛋糕被先做好了 顾客A也只能等待蛋糕师傅A把蛋糕做好 换句话说 顾客之间没有竞争关系

cha138/Article/program/Java/gj/201311/27425

相关参考

知识大全 Java多线程中run和start的区别

Java多线程中run和start的区别  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  区别调用

知识大全 C#实现的多线程异步数据包接收器框架

C#实现的多线程异步数据包接收器框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  几天前在博问

知识大全 C# 实现的多线程异步Socket数据包接收器

C#实现的多线程异步Socket数据包接收器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  几天

知识大全 wcf多线程和异步操作

  按照操作执行所需的资源类型我们可以将操作分为cpu绑定型操作和I/O绑定型操作前者主要是利用cpu进行密集运算后者大部分操作处理时间花在I/O处理上(比如文件系统网络资源)对于I/O绑定型的操作我

知识大全 C#实现的多线程异步Socket数据包接收器框架

C#实现的多线程异步Socket数据包接收器框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 C# 实现的多线程异步Socket数据包接收器框架

C#实现的多线程异步Socket数据包接收器框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Java的多线程-实现多线程及线程的同步

Java的多线程-实现多线程及线程的同步  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一.实现

知识大全 Java多线程编程基础之线程和多线程

Java多线程编程基础之线程和多线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  随着计算机技

知识大全 Java多线程如何创建多个线程

Java多线程如何创建多个线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java多线程的同

知识大全 超线程多核心下Java多线程编程分析

超线程多核心下Java多线程编程分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一Java环