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

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

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

更多文章:


指针变量和指针的关系(变量指针和指针变量有什么区别和联系)

指针变量和指针的关系(变量指针和指针变量有什么区别和联系)

大家好,如果您还对指针变量和指针的关系不太了解,没有关系,今天就由本站为大家分享指针变量和指针的关系的知识,包括变量指针和指针变量有什么区别和联系的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年11月6日 21:30

dos命令清屏(Windows DOS内部命令详解04——del、ren、cls、ver、date、time)

dos命令清屏(Windows DOS内部命令详解04——del、ren、cls、ver、date、time)

“dos命令清屏”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看dos命令清屏(Windows DOS内部命令详解04——del、ren、cls、ver、date、time)!

2026年11月6日 15:40

constantly的用法及词组(英语时态对应的时间状语都有哪些)

constantly的用法及词组(英语时态对应的时间状语都有哪些)

本篇文章给大家谈谈constantly的用法及词组,以及英语时态对应的时间状语都有哪些对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年11月6日 15:20

sql2016安装后如何打开(怎么打开sql server 2016 管理工具)

sql2016安装后如何打开(怎么打开sql server 2016 管理工具)

本篇文章给大家谈谈sql2016安装后如何打开,以及怎么打开sql server 2016 管理工具对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年11月6日 15:10

编程基础指令(数控编程指令有哪些)

编程基础指令(数控编程指令有哪些)

大家好,今天小编来为大家解答以下的问题,关于编程基础指令,数控编程指令有哪些这个很多人还不知道,现在让我们一起来看看吧!

2026年11月6日 12:50

如何运行perl教程(怎样把自己的电脑设置成服务器)

如何运行perl教程(怎样把自己的电脑设置成服务器)

各位老铁们好,相信很多人对如何运行perl教程都不是特别的了解,因此呢,今天就来为大家分享下关于如何运行perl教程以及怎样把自己的电脑设置成服务器的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年11月6日 12:20

arcgis怎么设置文本框样式?用JS怎么实现一个把一个文本框中的选中内容加粗,效果基本上和编辑器的加粗效果相同急需

arcgis怎么设置文本框样式?用JS怎么实现一个把一个文本框中的选中内容加粗,效果基本上和编辑器的加粗效果相同急需

今天给各位分享arcgis怎么设置文本框样式的知识,其中也会对arcgis怎么设置文本框样式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年11月6日 10:50

停止运行的快捷键(电脑怎么停止运行程序快捷键)

停止运行的快捷键(电脑怎么停止运行程序快捷键)

其实停止运行的快捷键的问题并不复杂,但是又很多的朋友都不太了解电脑怎么停止运行程序快捷键,因此呢,今天小编就来为大家分享停止运行的快捷键的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年11月6日 10:40

bios setup(“Bios setup”怎么在电脑里面设置)

bios setup(“Bios setup”怎么在电脑里面设置)

这篇文章给大家聊聊关于bios setup,以及“Bios setup”怎么在电脑里面设置对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年11月6日 10:00

三个表盘都代表什么(卡西欧手表里面三个小表盘是什么意思)

三个表盘都代表什么(卡西欧手表里面三个小表盘是什么意思)

各位老铁们,大家好,今天由我来为大家分享三个表盘都代表什么,以及卡西欧手表里面三个小表盘是什么意思的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年11月6日 08:10

最近更新

无线鼠标光标乱跑(鼠标乱跑)
2026-11-06 20:30:28 浏览:0
热门文章

新站如何通过网站维护提升SEO排名
2026-10-13 20:56:21 浏览:6
标签列表