java多线程的实现(Java多线程实现异步调用)

:暂无数据 2026-07-27 12:10:01 1

java多线程的实现(Java多线程实现异步调用)

其实java多线程的实现的问题并不复杂,但是又很多的朋友都不太了解Java多线程实现异步调用,因此呢,今天小编就来为大家分享java多线程的实现的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

本文目录

Java多线程实现异步调用

  在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;

  for (int i = ; i 《 count; i++) {

  buffer = 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把蛋糕做好 换句话说 顾客之间没有竞争关系

lishixinzhi/Article/program/Java/gj/201311/27425

经验分享:对Java中的线程感想(多线程)

1.进程和线程的区别
  通俗一点说,进程就是程序的一次执行,而线程可以理解为进程中的执行的一段程序片段。
  用一点文词说就是,每个进程都有独立的代码和数据空间(进程上下文);而线程可以看成是轻量级的进程。一般来讲(不使用特殊技术),同一进程所产生的线程共享同一块内存空间。
  同一进程中的两段代码是不可能同时执行的,除非引入线程。
  线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。
  线程占用的资源要少于进程所占用的资源。
  进程和线程都可以有优先级。
  在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。
  多进程——在操作系统中,能同时运行多个任务(程序)。
  多线程——在同一应用程序中,有多个顺序流同时执行。
  2.通过铁路售票程序来理解实现多线程的两种方法:通过java.lang.Thread类和通过Runnable接口
  java中有两种实现多线程的方式。一是直接继承Thread类,二是实现Runnable接口。那么这两种实现多线程的方式在应用上有什么区别呢?
  为了回答这个问题,我们可以通过编写一段代码来进行分析。我们用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示。
  我们首先这样编写这个程序:
  public class ThreadDome1{
  public static void main(String args){
  ThreadTest t = new ThreadTest();
  t.start();
  t.start();
  t.start();
  t.start();
  }
  }
  class ThreadTest extends Thread{
  private int ticket = 100;
  public void run(){
  while(true){
  if(ticket 》 0){
  System.out.println(Thread.currentThread().getName() +
  "is saling ticket" + ticket--);
  }else{
  break;
  }
  }
  }
  }
  上面的代码中,我们用ThreadTest类模拟售票处的售票过程,run方法中的每一次循环都将总票数减1,模拟卖出一张车票,同时该车票号打印出来,直接剩余的票数到零为止。在ThreadDemo1类的main方法中,我们创建了一个线程对象,并重复启动四次,希望通过这种方式产生四个线程。从运行的结果来看我们发现其实只有一个线程在运行,这个结果告诉我们:一个线程对象只能启动一个线程,无论你调用多少遍start()方法,结果只有一个线程。
  我们接着修改ThreadDemo1,在main方法中创建四个Thread对象:
  public class ThreadDemo1{
  public static void main(String args){
  new ThreadTest().start();
  new ThreadTest().start();
  new ThreadTest().start();
  new ThreadTest().start();
  }
  }
  class ThreadTest extends Thread{
  private int ticket = 100;
  public void run(){
  while(true){
  if(ticket 》 0){
  System.out.println(Thread.currentThread().getName() +
  " is saling ticket" + ticket--);
  }else{
  break;
  }
  }
  }
  }
  这下达到目的了吗?
  从结果上看每个票号都被打印了四次,即四个线程各自卖各自的100张票,而不去卖共同的100张票。这种情况是怎么造成的呢?我们需要的是,多个线程去处理同一个资源,一个资源只能对应一个对象,在上面的程序中,我们创建了四个ThreadTest对象,就等于创建了四个资源,每个资源都有100张票,每个线程都在独自处理各自的资源。
  经过这些实验和分析,可以总结出,要实现这个铁路售票程序,我们只能创建一个资源对象,但要创建多个线程去处理同一个资源对象,并且每个线程上所运行的是相同的程序代码。在回顾一下使用接口编写多线程的过程。
  public class ThreadDemo1{
  public static void main(String args){
  ThreadTest t = new ThreadTest();
  new Thread(t).start();
  new Thread(t).start();
  new Thread(t).start();
  new Thread(t).start();
  }
  }
  class ThreadTest implements Runnable{
  private int tickets = 100;
  public void run(){
  while(true){
  if(tickets 》 0){
  System.out.println(Thread.currentThread().getName() +
  " is saling ticket " + tickets--);
  }
  }
  }
  }
  上面的程序中,创建了四个线程,每个线程调用的是同一个ThreadTest对象中的run()方法,访问的是同一个对象中的变量(tickets)的实例,这个程序满足了我们的需求。在Windows上可以启动多个记事本程序一样,也就是多个进程使用同一个记事本程序代码。
  可见,实现Runnable接口相对于继承Thread类来说,有如下显著的好处:
  (1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。
  (2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。
  (3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。

java中实现多线程的方法有几种以及如何实现多线程

java中实现多线程的方法有两种,1:继承Tread类;2:实现Runable接口

1、
public class MyThread extends Thread{
//重写run()方法
public void run(){
    //多线程要做的事
}
public static void main(String args){
    MyThread m1 = new MyThread();
    MyThread m2 = new MyThread();
    m1.start();
    m2.start();
}
}
2、
public class NThread implements Runable{
    //实现run()方法
    public void run(){
    //多线程要做的事
    }
    public static void main(String args){
        NThread nt = new NThread();
        new Thread(nt,"nt1_name").start();
        new Thread(nt,"nt2_name").start();
    }
}

文章分享结束,java多线程的实现和Java多线程实现异步调用的答案你都知道了吗?欢迎再次光临本站哦!

java多线程的实现(Java多线程实现异步调用)

本文编辑:admin

更多文章:


it培训评价网(it培训排名机构十大IT培训机构)

it培训评价网(it培训排名机构十大IT培训机构)

这篇文章给大家聊聊关于it培训评价网,以及it培训排名机构十大IT培训机构对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年9月7日 13:00

个人博客页面布局(新手站长怎样做好独立博客初期运营工作)

个人博客页面布局(新手站长怎样做好独立博客初期运营工作)

大家好,如果您还对个人博客页面布局不太了解,没有关系,今天就由本站为大家分享个人博客页面布局的知识,包括新手站长怎样做好独立博客初期运营工作的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月7日 12:40

display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)

display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)

大家好,关于display flex 自动换行很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于overflow-y:hidden;overflow-x:auto;无效解决方法的知识点,相信应该可以解决大家的一些困惑和问题,如

2026年9月7日 11:00

小程序免认证源码(小程序源码都能干嘛)

小程序免认证源码(小程序源码都能干嘛)

本篇文章给大家谈谈小程序免认证源码,以及小程序源码都能干嘛对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月7日 10:50

timestamp without time zone(Postgresql中to_date()函数使用问题)

timestamp without time zone(Postgresql中to_date()函数使用问题)

各位老铁们好,相信很多人对timestamp without time zone都不是特别的了解,因此呢,今天就来为大家分享下关于timestamp without time zone以及Postgresql中to_date()函数使用问题

2026年9月7日 09:40

网页制作代码特效大全(谁知道网页打字机特效的代码)

网页制作代码特效大全(谁知道网页打字机特效的代码)

大家好,如果您还对网页制作代码特效大全不太了解,没有关系,今天就由本站为大家分享网页制作代码特效大全的知识,包括谁知道网页打字机特效的代码的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月7日 04:20

下载mysql的步骤(win10安装mysql的步骤和方法)

下载mysql的步骤(win10安装mysql的步骤和方法)

各位老铁们,大家好,今天由我来为大家分享下载mysql的步骤,以及win10安装mysql的步骤和方法的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年9月7日 04:10

webstorm怎么读(webstorm文件结构怎么打开)

webstorm怎么读(webstorm文件结构怎么打开)

本篇文章给大家谈谈webstorm怎么读,以及webstorm文件结构怎么打开对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月7日 03:50

nio新特性(Java NIO与IO的区别和比较)

nio新特性(Java NIO与IO的区别和比较)

各位老铁们好,相信很多人对nio新特性都不是特别的了解,因此呢,今天就来为大家分享下关于nio新特性以及Java NIO与IO的区别和比较的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年9月7日 03:40

checked in(check in和check out的区别)

checked in(check in和check out的区别)

本篇文章给大家谈谈checked in,以及check in和check out的区别对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月7日 01:20

最近更新

福建建筑人才市场(就业协议书)
2026-09-07 12:30:14 浏览:0
热门文章

yoga pro 14s carbon(yoga14s接口类型)
2026-07-03 17:50:01 浏览:5
domino directory(帮我翻译一下Recipient’s Domino Directory entry does not specify a valid Notes mail file)
2026-08-03 19:20:01 浏览:4
标签列表