异步处理FutureTask实例「建议收藏」

异步处理FutureTask实例「建议收藏」   在Web应用前端,AJAX有同步和异步处理,异步可以避免阻塞。在WEB后端一般业务应用大多为同步处理,但也有一些需要异步处理的场合,比如A系统调B系统接口I,但B系统处理时间很长,这时,A系统主线程不能一直阻塞等待,可以使用异步处理。即先调用接口I,随即做后面的处理,等B系统返回值时再进行返回后处理。时序为:A:invokeIA:dootherthingB:处理完成,…

大家好,又见面了,我是你们的朋友全栈君。

    在Web应用前端,AJAX有同步和异步处理,异步可以避免阻塞。在WEB后端一般业务应用大多为同步处理,但也有一些需要异步处理的场合,比如A系统调B系统接口I,但B系统处理时间很长,这时,A系统主线程不能一直阻塞等待,可以使用异步处理。即先调用接口I,随即做后面的处理,等B系统返回值时再进行返回后处理。

时序为:

A: invoke I

A:do otherthing

B:处理完成,返回值

A:根据接口返回值进行后处理

1、代码例子:

package com.hf.test;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

import com.xxx.framework.po.ResponseResult;

public class FutureTest {
	Map<String, Object> params = new HashMap<String,Object>(); 
	
	ExecutorService executorService = Executors.newFixedThreadPool(3);
	
	public void test1(){
		params.put("clsId","clsId-001");
		params.put("ids", "001,002,003,004");
		FutureTask<ResponseResult> futureTask = new FutureTask<>(
				new MyTask(params));  
		

		executorService.submit(futureTask); 
		executorService.submit(new MonitorTask(futureTask));
		executorService.submit(getCollectJob(futureTask));
		
		System.out.println("HERE!!!");
	} 
	
	
	/**
	 * 返回收集工作
	 * @param futureTask
	 * @return
	 */
	public Runnable getCollectJob(final FutureTask<ResponseResult> futureTask) {
		return new Runnable() {
			public void run() {
				while(true){
					try {
						Thread.sleep(100); 
						if(futureTask.isDone()){
							ResponseResult resp = futureTask.get();
							System.out.println("2返回值:" + resp.getData());
							break;
						}		
						System.out.println("2Not finished.");
					} catch (Exception e) {
						e.printStackTrace();
					} 
				} 
			}
		};
	}
	
	
	/**
	 * 关闭线程池
	 */
	public void closeThreadPool(){
		executorService.shutdown();
	}  
	
	
	/**
	 * 测试主入口
	 * @param args
	 */
	public static void main(String[] args) {
		FutureTest ft = new FutureTest();
		ft.test1();
 
		System.out.println("Do other things...");
		ft.closeThreadPool();
	}
}

程序说明:

    这里采用的模式是调用接口和收集结果2条线,分别用不同的线程来执行。调用接口线程sumit后,收集线程随即开始工作,每隔100ms查询一遍返回状态,若接口返回,则打印返回值,否则一直打印“NOT  FINISHED”。

2、例子2

    若需要处理复杂的情形,如使用回调、传入参数处理返回结果,则可参考下面的例子。

package com.hf.test;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

import com.xxx.framework.po.ResponseResult;

public class FutureTest2 {
	Map<String, Object> initParams = new HashMap<String,Object>(); 
	
	ExecutorService executorService = Executors.newFixedThreadPool(3);
	
	public void test1(){
		initParams.put("clsId","clsId-001");
		initParams.put("ids", "001,002,003,004"); 
		
		MyCallback myCallback = new MyCallback(initParams);
		FutureTask<ResponseResult> futureTask = new FutureTask<>(
				new MyTask2(myCallback));  		

		executorService.submit(futureTask);  
		
		System.out.println("HERE!!!");
	}  
	
	
	/**
	 * 关闭线程池
	 */
	public void closeThreadPool(){
		executorService.shutdown();
	}  
	
	
	/**
	 * 测试主入口
	 * @param args
	 */
	public static void main(String[] args) {
		FutureTest2 ft = new FutureTest2();
		ft.test1();
 
		System.out.println("Do other things...");
		ft.closeThreadPool();
	}
}

回调处理类:

package com.hf.test;

import java.util.HashMap;
import java.util.Map;

import com.xxx.framework.po.ResponseResult;

public class MyCallback {
	Map<String, Object> initParams = new HashMap<String, Object>();
	
	public MyCallback(Map<String, Object> initParams){
		this.initParams = initParams;
	} 
	
	public ResponseResult doSomething(Map<String,Object> params){
		System.out.println("HERE:" + params);
		String result = "Found param pwid:" + params.get("pwid") 
			+ ",state:" + params.get("state");
		System.out.println("异步线程处理完成,结果:" + result);
		return ResponseResult.successResult("异步线程处理完成,结果:" + result);
	}
}

异步任务类:

package com.hf.test;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;

import com.xxx.framework.po.ResponseResult;
 
public class MyTask2 implements Callable<ResponseResult>{ 	
 
	MyCallback myCallback = null;
	
	public MyTask2(MyCallback myCallback){
		this.myCallback = myCallback;
	}  

	@Override
	public ResponseResult call() throws Exception {
		System.out.println("Start processing...");
		
		//模拟处理过程
		Thread.sleep(10*1000); 
		Map<String, Object> params = new HashMap<String,Object>(); 
		params.put("pwid","pwid-001");
		params.put("state", "已退回");
		//模拟处理结束
		ResponseResult result = myCallback.doSomething(params);
		return result;
	}
}

程序说明:

    主线程类为FutureTest2,异步任务类为MyTask2,回调类为MyCallback。将回调处理类作为参数传给异步任务类myTask2,当任务结束时,调用回调处理类MyCallback的回调函数,完成任务结束后的“后处理”。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149955.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 跳出循环的三种方式

    跳出循环的三种方式break、continue、goto三个关键字都可以用于跳出循环,但三者跳出循环的情况却有所不同braek:跳出本层循环,执行本层循环下面的语句。continue:终止本次循环,进入下一次循环。goto:调到标号所在位置,执行标号下面的语句,它比较方便的是可以一次跳出多重循环,但是它只能在函数内跳转,不能在函数间跳转。goto语句有一定的弊病,会使程序的流程变得混乱,有时会难以理解,并

    2022年6月3日
    45
  • android psd预览图软件,来自psd的Android Vector drawable具有空预览

    android psd预览图软件,来自psd的Android Vector drawable具有空预览在屏幕截图中,文件中没有pathdata.因此,屏幕上没有任何内容.我正在显示VectorDrawablexml文件的内容.将内容复制到androidstudio中的空白xml文件中,并在屏幕上看到蓝色绘制的形状.android:width=”600dp”android:height=”600dp”android:viewportWidth=”800.0″android:viewportHei…

    2022年5月3日
    44
  • java程序日志管理

    java程序日志管理初入软件开发这一行的人,可能对日志管理的概念并不是很明确,大概是由于经验所限,以至于根本还考虑不到这个问题。而从某种意义上来说,日志管理实际上也不需要初入这一行的人来管,他们只需要负责实现自己的主要业务逻辑和功能就好了。我当初刚入行的时候就有很长一段时间完全不用去关心日志,到后来偶尔涉及到的时候,也都是从其他地方采用cv大法直接搬用。不过,随着工作时间的变化,随着手头上任务重要程度的变化

    2022年6月10日
    21
  • 3万计算机配置清单,电脑组装知识网预算2万至3万元电脑主机推荐九代酷睿i9-9900K搭RTX2080Ti全能型高配电脑主机配置清单…

    3万计算机配置清单,电脑组装知识网预算2万至3万元电脑主机推荐九代酷睿i9-9900K搭RTX2080Ti全能型高配电脑主机配置清单…本文转自:http://www.dn010.com/peizhi/710.html近日,一位网友联系了小编,说他要配一套高配置的电脑主机,主机预算约为2万至3万元,针对该网友的预算要求,小编提供一套九代酷睿i9-9900K搭RTX2080Ti全能型高配电脑主机配置清单,用户还可根据自己的喜好调整电脑配置。电脑配置清单:注意:由于更新电脑硬件的速度更快,如果产品停产,请使用新产品。另外,硬件价格会随…

    2022年7月16日
    15
  • maven项目使用mybatis插件Free Mybatis plugin「建议收藏」

    maven项目使用mybatis插件Free Mybatis plugin「建议收藏」首先安装插件如图所示选择第一个插件安装,安装完毕重启IDEA 然后我们选择我们已经配置好的数据库如下图在需要生成配置文件的数据库上右键,就会出现mybatis-generator选项打开这个就打开如上图所示配置窗口,这里我们使用默认的就行,如果不想使用lombok去掉这个勾选即可,然后我们选择ok即可就会生成以上文件,一个数据库的映射类,一个操作数据库的映射接口,和具体操作数据库的xml,主配置文件就在Configure里面这个自己生成…

    2022年9月28日
    0
  • protostuff java_protostuff 及其注意事项

    protostuff java_protostuff 及其注意事项google开发的开源的序列化方案protocolbuffer(简称protobuf),它的好处很多,独立于语言,独立于平台,最最重要的是它的效率相当高,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一。protostuff是一个基于protobuf实现的序列化方法,它较于protobuf最明显的好处是,在几乎不损耗性能的情况下做到了不用…

    2022年5月2日
    81

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号