`
blueram
  • 浏览: 762582 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

(转)spring执行同步任务和异步任务

 
阅读更多

顾名思义:同步任务是指事情需要一件一件的做,做完当前的任务,才能开始做下一任务;异步任务是指做当前任务的同时,后台还可以在执行其他任务,可理解为可同时执行多任务,不必一件一件接着去做,下面开始上例子了

 

1.同步任务

/*
 * @(#)SyncTaskExecutorTest.java    2011-4-27
 *
 * Copyright (c) 2011. All Rights Reserved.
 *
 */

package org.jsoft.opensource.demos.spring.task;

import org.junit.Test;
import org.springframework.core.task.SyncTaskExecutor;

/**
 * Spring同步任务处理
 *
 * @author <a href="mailto:hongyuan.czq@taobao.com">Gerald Chen</a>
 * @version $Id: SyncTaskExecutorTest.java,v 1.1 2011/05/30 08:58:07 gerald.chen Exp $
 */
public class SyncTaskExecutorTest {

    @Test
    public void test() throws InterruptedException {
        SyncTaskExecutor executor = new SyncTaskExecutor();
        executor.execute(new OutThread());
        System.out.println("Hello, World!");
        Thread.sleep(10000 * 1000L);
    }
    
    static class OutThread implements Runnable {

        public void run() {
            for (int i = 0; i < 1000; i++) {
                System.out.println(i + " start ...");
                try {
                    Thread.sleep(2 * 1000L);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        
    }
}

必须在线程任务执行完毕之后,"Hello,World!"才会被打印出来

2.异步任务

 /*

 * @(#)AsyncTaskExecutorTest.java    2011-4-27
 *
 * Copyright (c) 2011. All Rights Reserved.
 *
 */

package org.jsoft.opensource.demos.spring.task;

import org.junit.Test;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.core.task.SimpleAsyncTaskExecutor;

/**
 * Spring异步任务处理
 *
 * @author <a href="mailto:hongyuan.czq@taobao.com">Gerald Chen</a>
 * @version $Id: AsyncTaskExecutorTest.java,v 1.1 2011/05/30 08:58:07 gerald.chen Exp $
 */
public class AsyncTaskExecutorTest {

    @Test
    public void test() throws InterruptedException {
        AsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("sys.out");
        executor.execute(new OutThread(), 50000L);
        System.out.println("Hello, World!");
        Thread.sleep(10000 * 1000L);
    }
    
    static class OutThread implements Runnable {

        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println(i + " start ...");
                try {
                    Thread.sleep(2 * 1000L);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        
    }
}

  

"Hello,World!"被正常打印出来,线程任务在后台静静地执行.

 

3、AsyncTaskExecutor 调用带有返回值的多线程(实现callable接口),也是同步的

package org.jsoft.opensource.demos.spring.task;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

import org.junit.Test;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.core.task.SimpleAsyncTaskExecutor;


/**
 * Spring异步任务处理 中易出错的
 *
 * @author blueram
 */
public class AsyncTaskExecutorCallbleTest {

    @Test
    public void test() throws InterruptedException, ExecutionException {
        AsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("sys.out");
        Future<String> future = executor.submit(new OutThread());
        System.out.println(future.get());
        System.out.println("Hello, World!");
        Thread.sleep(10000 * 1000L);
    }
    
    static class OutThread implements Callable<String> {

        public void run() {
            
        }

		@Override
		public String call() throws Exception {
			String ret = " i test callable";
			for (int i = 0; i < 10; i++) {
                	try {
                    		Thread.sleep(2 * 1000L);
                    		System.out.println("i sleep 1s");
                	} catch (InterruptedException e) {
                   		 // TODO Auto-generated catch block
                   		 e.printStackTrace();
                	}
           	 }
			return ret;
		}  
    }
}
 

 

在使用中发现AsyncTaskExecutor 的方法submit也是阻塞型的,因此也可以认为是同步的。

 

原文地址:http://hi.baidu.com/jadmin/item/eea662bc906676402aebe307

  • 大小: 13.9 KB
  • 大小: 74.4 KB
  • 大小: 61.3 KB
分享到:
评论

相关推荐

    spring线程池(同步、异步).docx

    在Spring框架中,线程池的使用是实现并发和异步任务执行的关键工具。线程池的概念源于Java的`java.util.concurrent.ExecutorService`接口,它允许我们管理一组可重用的工作线程,以提高系统效率并减少资源消耗。...

    spring的定时任务和异步方法

    本篇将详细探讨Spring中的定时任务和异步方法,帮助开发者更好地理解如何在项目中实现定时任务调度和提高程序执行效率。 首先,我们来关注Spring的定时任务。Spring提供了`@Scheduled`注解,通过这个注解,我们可以...

    springboot 定时任务(线程配置,并行【同步】、异步等)

    在Spring Boot应用中,定时任务是一项非常重要的功能,它允许我们按照预定的时间间隔执行特定的任务。Spring Boot集成了Spring Framework的...这使得在Spring Boot应用中处理定时任务和多线程问题变得更加简单高效。

    Spring3.2异步处理http请求

    `AsyncConfigurer`是Spring提供的接口,用于自定义异步任务的配置,包括`TaskExecutor`的选择和设置。`TaskExecutor`是Spring的核心组件,负责线程池的管理,用于执行异步任务。 ```java @Configuration @...

    Spring MVC异步模式

    在使用`@Async`之前,需要配置一个`TaskExecutor`,这是Spring用于执行异步任务的接口。Spring MVC默认提供了一个简单的`SimpleAsyncTaskExecutor`,但通常我们会选择更高效的实现,如`ThreadPoolTaskExecutor`。 ...

    spring 任务调度

    - **基本概念**:Spring Task是Spring框架的一部分,提供了基本的定时任务调度功能,包括`@Scheduled`注解用于标记定时任务,以及`TaskScheduler`和`ThreadPoolTaskScheduler`接口用于异步执行任务。 - **@...

    SpringBoot定时任务实现Oracle和mysql数据同步

    Spring Boot作为Java领域的一个热门微服务框架,提供了强大的定时任务功能,能够帮助我们实现不同数据库间的数据同步,比如Oracle到MySQL。本篇文章将详细讲解如何利用Spring Boot的定时任务特性,结合Java的相关...

    Spring实现任务调度.rar

    `TaskExecutor`接口提供了一个简单的API来执行异步任务。你可以使用`ThreadPoolTaskExecutor`或`SimpleAsyncTaskExecutor`等实现类来配置线程池或者简单地为每个任务创建新线程。配置`TaskExecutor`时,可以调整...

    Spring的定时任务开发及对Quartz和Timer支持

    首先,Spring提供了自己的`TaskExecution`和`TaskScheduling`模块,用于执行异步任务和定时任务。`TaskExecutor`接口用于异步执行任务,而`TaskScheduler`接口则用于调度定时任务。通过实现这些接口或使用其默认实现...

    Spring定时任务

    Spring提供`@Async`注解来支持异步任务执行,可以将定时任务与主线程分离,避免阻塞。同时,通过`@Scheduled`注解的`concurrent`属性,可以控制多个实例是否并发执行。 8. **监听任务状态** Spring还提供了`...

    springboot 同步解耦 异步化

    1. **AsyncConfigurer**:SpringBoot提供了`@EnableAsync`注解,配合`AsyncConfigurer`接口,可以全局配置一个线程池来处理异步任务。只需在配置类上添加`@EnableAsync`,并实现`AsyncConfigurer`接口,定义线程池...

    定时任务spring3.0

    Spring 3.0版本引入了对定时任务的支持,这是一个非常实用的功能,可以帮助开发者实现定期执行的任务,如数据同步、报表生成等。本文将深入探讨Spring 3.0中的定时任务实现,并结合Quartz库来进一步扩展定时任务的...

    spring中邮件及定时任务

    Spring还提供了`@Async`注解来实现异步任务,这在处理耗时操作时非常有用。当一个方法被`@Async`标记后,它将在单独的线程中执行,不会阻塞调用者的执行流程。结合定时任务,可以创建异步定时任务,提高系统的并发...

    spring2 计划任务

    此外,Spring还提供了`@Async`注解来实现异步任务,与`@Scheduled`不同的是,`@Async`适用于一次性或者无固定时间间隔的任务。结合`@EnableAsync`,可以将方法异步执行,提高系统的并发性能。 在实际开发中,我们...

    Spring Boot Async异步执行任务过程详解

    另外关于执行异步任务的线程池我们也可以自定义,首先我们定义一个线程池的配置类,用来配置一些参数。例如: @Configuration @ConfigurationProperties(prefix = "spring.task.pool") public class ...

    Spring基于线程池的定时任务线挰异常实践

    它可以与Spring的定时任务和线程池组件结合使用,例如在处理HTTP请求后启动异步任务,或者定时更新Web应用的数据。 总结来说,这篇博文探讨了如何在Spring中使用线程池执行定时任务,包括配置线程池、创建定时任务...

    java操作图片,异步同步上传回显

    在编程中,同步操作意味着一个任务执行完毕后才会执行下一个任务,而异步则允许同时进行多个任务,不需等待某一个任务完成。在图片上传场景中,如果采用同步方式,用户可能会感受到较长的等待时间,而异步则可以提高...

    Spring的 Scheduled任务调度.docx

    在 Spring 框架中,定时任务调度是一个重要的特性,尤其在微服务和分布式系统中,定时任务常常用于数据同步、清理、统计等场景。Spring 提供了多种定时任务的实现方式,包括 Java 自带的 Timer、Quartz 和 Spring ...

    Spring-task定时任务

    它可以处理一次性任务和周期性任务,支持基于时间(如cron表达式)或间隔时间的调度。 ### 二、注解方式使用 1. **@Scheduled注解** - `@Scheduled`是Spring-task的核心注解,用于标记一个方法为定时任务。例如:...

Global site tag (gtag.js) - Google Analytics