您的位置:

java等待异步执行完成后

本文目录一览:

java异步方法什么意思

在JAVA平台,实现异步调用的角色有如下三个角色:调用者,取货凭证,真实数据

异步调用就是:一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据.

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率

只有一个马桶

很多人上厕所

要排队

这叫同步迅雷一次可以下载很多东西

这叫异步

Java 怎么在Main函数中,执行完异步任务后才退出主线程

要实现这个情况,必须知道以下几点

1、java中线程的结束是由run方法运行完成后自动结束的

2、在main线程(主线程)中,需要得到所有线程的引用。

3、知道jdk提供的CountDownLatch的用法

例子如下:

public static void main(String[] args) throws InterruptedException

{

//CountDownLatch作为计数器纪录有几个线程,例如有2个线程

CountDownLatch latch=new CountDownLatch(2);

Worker worker1=new Worker( latch);

Worker worker2=new Worker(latch);

worker1.start();// 启动线程

worker2.start();//

//等待所有工人完成工作

latch.await();

System.out.println("all work done at "+sdf.format(new Date()));

}

class Worker extends Thread

{

private CountDownLatch latch;

public Worker(CountDownLatch latch)

{

this.latch = latch;

}

public void run()

{

xxxxx

//在run方法结束之前,讲线程计数器减一

latch.countDown();

}

}

java 异步调用方法

asynchronous call(异步调用)

一个可以无需等待被调用函数的返回值就让操作继续进行的方法

中文名

异步调用

外文名

asynchronous call

领域

函数

杰作

线程

快速

导航

实战用法异步调用使用方法

举例

异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你就去做别的了。

同步调用就是你 喊 你朋友吃饭 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你们一起去。

实战用法

操作系统发展到今天已经十分精巧,线程就是其中一个杰作。操作系统把 CPU 处理时间划分成许多短暂时间片,在时间 T1 执行一个线程的指令,到时间 T2又执行下一线程的指令,各线程轮流执行,结果好象是所有线程在并肩前进。这样,编程时可以创建多个线程,在同一期间执行,各线程可以“并行”完成不同的任务。

在单线程方式下,计算机是一台严格意义上的冯·诺依曼式机器,一段代码调用另一段代码时,只能采用同步调用,必须等待这段代码执行完返回结果后,调用方才能继续往下执行。有了多线程的支持,可以采用异步调用,调用方和被调方可以属于两个不同的线程,调用方启动被调方线程后,不等对方返回结果就继续执行后续代码。被调方执行完毕后,通过某种手段通知调用方:结果已经出来,请酌情处理。

java队列实现异步执行

在整个思路上要调整一下

1、会有很多线程给一个队列上添加任务

2、有一个或者多个线程逐个执行队列的任务

考虑一下几点:

1、没有任务时,队列执行线程处于等待状态

2、添加任务时,激活队列执行线程,全部run起来,首先抢到任务的执行,其他全部wait

给个小例子吧

package org;

import java.util.LinkedList;

import java.util.List;

public class Queues {

public static ListTask queue = new LinkedListTask();

/**

 * 假如 参数o 为任务

 * @param o

 */

public static void add (Task t){

synchronized (Queues.queue) {

Queues.queue.add(t); //添加任务

Queues.queue.notifyAll();//激活该队列对应的执行线程,全部Run起来

}

}

static class Task{

public void test(){

System.out.println("我被执行了");

}

}

}

package org;

import java.util.List;

public class Exec implements Runnable{

@Override

public void run() {

while(true){

synchronized (Queues.queue) {

while(Queues.queue.isEmpty()){ //

try {

Queues.queue.wait(); //队列为空时,使线程处于等待状态

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("wait...");

}

Queues.Task t= Queues.queue.remove(0); //得到第一个

t.test(); //执行该任务

System.out.println("end");

}

}

}

public static void main(String[] args) {

Exec e = new Exec();

for (int i = 0; i  2; i++) {

new Thread(e).start(); //开始执行时,队列为空,处于等待状态

}

//上面开启两个线程执行队列中的任务,那就是先到先得了

//添加一个任务测试

Queues.Task t =new Queues.Task();

Queues.add(t); //执行该方法,激活所有对应队列,那两个线程就会开始执行啦

}

}

上面的就是很简单的例子了

java常见的几种调用机制(同步调用,异步调用

1、同步调用

同步调用是最基本的调用方式,对象b中的方法直接调用对象a的方法,这个时候程序会等待对象a的方法执行完返回结果之后才会继续往下走。

代码如下:

public class A {

public void methodA()

{

System.out.println("this is class A method");

}

}

public class B {

public void methodB()

{

A a = new A();

a.methodA();

System.out.println("this is class B method");

}

}

public class Test {

public static void main(String[] args) {

B b = new B();

b.methodB();

}

}

结果:

this is class A method

this is class B method

2、异步调用

对象b中的方法调用对象a的方法,程序并不需要等待对象a的方法返回结果值,直接继续往下走。

代码如下:

public class A extends Thread{

@Override

public void run() {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("this is class A method");

}

}

public class B {

public void methodB()

{

A a = new A();

a.start();

System.out.println("this is class B method");

}

}

public class Test {

public static void main(String[] args) {

B b = new B();

b.methodB();

}

}

结果:

this is class B method

this is class A method

说明:异步调用我们通常采用多线程的方法来达到目的

3、回调

对象a的方法methodA()中调用对象b的methodB()方法,在对象b的methodB()方法中反过来调用对象a的callBack()方法,这个callBack()方法称为回调函数,这种调用方法称为回调。

代码如下:

public class A {

public void methodA()

{

B b = new B();

b.methodB(new A());

System.out.println("this is class A method : methodA");

}

public void callBack()

{

System.out.println("this is class A method : callBack");

}

}

public class B {

public void methodB(A a)

{

System.out.println("this is class B method : methodB");

a.callBack();

}

}

public class Test {

public static void main(String[] args) {

A a = new A();

a.methodA();

}

}

运行结果:

this is class B method : methodB

this is class A method : callBack

this is class A method : methodA

注意:这里如果为了代码的扩展性更好,可以把类A与类B抽象出一个接口出来,然后用实现类去实现着两个接口,这样代码的扩展性会更好,也能满足更多的业务场景。

回调的核心在于:回调方将本身对象传给调用方,调用方在本身代码逻辑执行完之后,调用回调方的回调方法。