「java异步任务」java异步任务 spring异步

博主:adminadmin 2023-03-18 20:03:10 625

今天给各位分享java异步任务的知识,其中也会对java异步任务 spring异步进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

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

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

Java中的线程同步与异步如何理解?

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。

另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

同步就是只能A走完某一段然后停下,让B开始走一段再停下,再让A走。。如此往复。简单理解就是,必须是一段程序执行完后才能执行后面的程序。。

异步就是,同一时间可能A和B同时都在往终点赶,此时不存在先后顺序,就是说,两个程序可以同时执行,称为异步。

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

如题,有时候我们需要在Main函数中写测试代码,并且需要在异步线程中执行任务,任务执行完之后才退出主线程,如何做到的呢,请看如下代码:

[java] view plain copy

public class TestMain {

/**

* @param args

*/

public static void main(String[] args) {

System.out.println("-------work------start---------");

LockHandler mHandler=new LockHandler();

Thread mThread=new Thread(new WorkRunnable(mHandler));

mThread.setDaemon(true);

mThread.start();

mHandler.waitForDebug();

System.out.println("-------work------end---------");

}

public static class WorkRunnable implements Runnable

{

public LockHandler mHandler;

public WorkRunnable(LockHandler mHandler)

{

this.mHandler = mHandler;

}

public void run() {

//TODO

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("-------我在异步线程中睡了五秒---------");

mHandler.notifytForDebug();

}

}

public static class LockHandler

{

public synchronized void waitForDebug()

{

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

public synchronized void notifytForDebug()

{

this.notifyAll();

}

}

}

执行结果:

-------work------start---------

-------我在异步线程中睡了五秒---------

-------work------end---------

只需要重写WorkRunnable类的run()方法.

java异步任务如何设置过期时间

可设置Map中的Entry在一段时间后自动过期。 2.可设置Map最大容纳值,当到达Maximum size后,再次插入 值会导致Map中的第一个值过期

JAVA如何实现异步回调

FutureTaskString futureTask=new FutureTask(new CallableString() {

@Override

public String call() throws Exception {

// TODO Auto-generated method stub

return "回调完成";

}

});

try {

String str=futureTask.get();

if(str.equals("回调完成"))

System.out.println("异步任务完成!");

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ExecutionException e) {

// TODO Auto-generated catch block

e.printStackTrace(); }

关于java异步任务和java异步任务 spring异步的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。