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

异步任务系列一

阅读更多

写在这之前,我啰嗦几句吧,说说如何把自己的个人编程能力提高一个档次,可能基本的java代码我们已经写了千遍万遍了,感觉技术总停留在这个层次,无法突破,这可能是一般程序员所要经历的一个过程,这个时候你需要从前辈,牛人那里汲取营养,无非是仔细研磨开源代码,从中理解他们的编程思想,编程习惯,解决问题的方式,想想如果自己来实现,我们会怎么实现,当然,这个过程是异常艰辛的,可能看着一堆堆的代码,网状似的交横,眼睛都看干涩了,但你不能走马观花,似懂非懂,很难从中学到精髓,你必须看了一遍又一遍,仔细推敲,我相信久了,不经之中你已在慢慢突破自己了,当然也许是个人之言,但是为己之经历,一切贵在沉静坚持,好了,说正题了。

异步任务调度:
提到这个,不觉想到了Timer,TimerTask,FutureTask,Future,ScheduledExecutorService等
说起来,Timer,TimerTask大家可能使用到更多一点,然而,这个类其实提供的功能有限,不够灵活,其中还存在一个最大的坏处就是方法体内如果处理抛出异常,可能停止了调度任务的能力,而ScheduledExecutorService这个异步类则解决了这一点,好了贴上代码

 

package com.taobao.common.store.journal.test;


import java.util.Timer;
import java.util.TimerTask;


/**
 * 我们来讲讲timer与ScheduledExecutorService的区别
 */
public class TimerTest {
	private Timer timer = new Timer();
	//启动计时器
	public void lanuchTimer(){
		timer.schedule(new TimerTask(){
			public void run() {
				//人为抛出异常,timer停止,无法派发任务
				throw new RuntimeException();
			}
		}, 1000*3, 500);
	}
	//向计时器添加一个任务
	public void addOneTask(){
		timer.schedule(new TimerTask(){
			public void run(){
				System.out.println("hello world");
			}
		}, 1000*1,1000*5);
	}
	
	public static void main(String[] args) throws Exception {
		TimerTest test = new TimerTest();
		test.lanuchTimer();
		Thread.sleep(1000*5);//5秒钟之后添加一个新任务
		test.addOneTask();
	}
}

 

   package com.taobao.common.store.journal.test;


import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledExecutorTest {
	//线程池能按时间计划来执行任务,允许用户设定计划执行任务的时间,int类型的参数是设定
	//线程池中线程的最小数目。当任务较多时,线程池可能会自动创建更多的工作线程来执行任务
	public ScheduledExecutorService scheduExec = Executors.newScheduledThreadPool(1);
	//启动计时器
	public void lanuchTimer(){
		Runnable task = new Runnable() {
			public void run() {
				System.out.println("难道就不执行了吗?");
				throw new RuntimeException();
			}
		};
		scheduExec.scheduleWithFixedDelay(task, 1000*5, 1000*10, TimeUnit.MILLISECONDS);
	}
	//添加新任务
	public void addOneTask(){
		Runnable task = new Runnable() {
			public void run() {
				System.out.println("welcome to china");
			}
		};
		scheduExec.scheduleWithFixedDelay(task, 1000*1, 1000, TimeUnit.MILLISECONDS);
	}
	
	public static void main(String[] args) throws Exception {
		ScheduledExecutorTest test = new ScheduledExecutorTest();
		test.lanuchTimer();
		Thread.sleep(1000*5);//5秒钟之后添加新任务
		test.addOneTask();
	}
}

 

    在下面篇幅,会慢慢讲解下异步任务系统及实战。

 

分享到:
评论

相关推荐

    dotnet-AspNetCore项目中非常轻量的异步任务管理模块

    标题提到的"dotnet-AspNetCore项目中非常轻量的异步任务管理模块"正是针对这类需求的一个解决方案。这个模块可能是为了简化任务调度、提高系统性能和资源利用率而设计的。 描述中提到的“非常轻量”意味着这个模块...

    异步任务中Activity销毁时的代码示例

    此时,如果异步任务仍在运行,可能引发一系列问题,比如内存泄漏、数据不一致等。因此,理解如何在Activity销毁时正确处理异步任务至关重要。 首先,让我们深入了解一下Android中的Activity生命周期。在Android中,...

    异步任务库.zip

    异步任务库,如标题所示,是用于Swift和ObjC编程的Promise库,它被...同时,由于PromiseKit是一个社区驱动的开源项目,不断有新的特性添加和问题修复,因此它是Swift和Objective-C开发者处理异步任务的一个强大工具。

    Python使用Beanstalkd做异步任务处理的方法共

    Beanstalkd是一款轻量级的、高性能的分布式作业队列系统,常用于实现异步任务处理。它能够帮助开发者将耗时的操作从主线程中分离出来,提高应用程序的响应速度。在Python中,我们可以利用`beanstalkc`库与Beanstalkd...

    07.aiohttp多任务异步协程1

    在`main`函数中,我们创建了一个异步会话,然后使用列表推导式创建了一系列的异步任务,并通过`asyncio.create_task()`函数将它们放入任务队列。最后,`await asyncio.wait(tasks)`会等待所有任务完成。这种异步编程...

    swift-异步请求串行形成任务链当其中一个任务中断则断开整条任务链

    这种模式允许我们按照特定顺序执行一系列任务,每个任务的结果可能作为下一个任务的输入,同时保证了任务间的独立性和线程安全。当其中任何一个任务中断时,整个任务链会停止执行,这有助于防止资源浪费和错误蔓延。...

    Javacripts异步编程课件

    此外,在需要并行或并发执行多个异步任务时,虽然最终行为没有问题,但代码形式上不够简洁,缺乏直观性。 **异步编程的现代解决方案** 为了解决回调函数的缺陷,现代JavaScript异步编程提供了新的解决方案,其中`...

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

    1. `SimpleAsyncTaskExecutor`:每次请求都会启动新的线程,不进行线程复用,因此不是真正的线程池,主要用于简单的异步任务执行。 2. `SyncTaskExecutor`:这是一个同步执行器,任务在同一线程中执行,不涉及多线程...

    C#异步操作的一个例子

    在C#编程中,异步操作是现代应用开发的核心特性之一,它允许程序...文件名"Ex03_01"可能是指一系列教程或代码示例中的第三个部分,重点介绍异步操作的第一个实例,它可能是逐步引导用户了解如何在实践中使用这些概念。

    博客资源:RxJava封装异步任务RxAsyncTask

    **RxAsyncTask** 的出现就是为了解决这些问题,它利用RxJava的特性,将异步任务的执行和结果传递变得更加优雅和高效。 **RxJava的核心概念:** 1. **Observable(可观测者)** - 发布数据的源头,可以是任何产生...

    springboot系列教程(四):定时任务与异步

    springboot系列教程(四):定时任务与异步

    AsyncCalls(异步调用函数)

    1. **异步方法调用**:异步调用函数允许你将一个方法的调用包装成一个异步任务,然后在后台线程执行。这样,主线程可以继续处理其他任务,而不会被长时间运行的操作阻塞。 2. **事件处理**:在异步操作完成后,通常...

    swift-PromiseKitiOS和OSX的异步任务库

    PromiseKit 是一个强大的工具,它将Promise编程的概念引入到Swift中,使得在iOS和OS X平台上处理异步任务变得更加简洁和优雅。Promise编程是一种处理异步操作的方式,它通过链式调用来组织复杂的异步流程,避免了回...

    pb-异步处理

    在单线程环境中,异步处理是通过将任务分解为独立的组件并在后台执行来提高程序响应速度的一种方法。这通常涉及到事件驱动编程,即在主程序执行的同时,其他任务在后台运行并通知主线程完成情况。 在描述中提到的...

    c#.net异步机制

    7. **异步IO**:C#.NET提供了一系列异步的IO方法,如`Stream.ReadAsync`和`HttpClient.GetAsync`,它们都支持TAP,可以直接与`async`/`await`一起使用。 8. **异步UI更新**:在UI应用中,如Windows Forms或WPF,...

    java多线程异步性

    在Java中,通常通过Future和Callable接口实现异步计算,或者使用ExecutorService和CompletionService来管理和控制异步任务。 三、ExecutorService与ThreadPoolExecutor ExecutorService是Java并发框架中的核心接口...

    Django中使用celery完成异步任务的示例代码

    然后,在`testcelery`应用中创建一个名为`tasks.py`的文件,定义你的异步任务。这里我们创建一个名为`start_running`的任务,它会打印一系列的字符并等待一段时间: ```python from TestCelery.celery import app ...

    android 简单同步与异步

    3. **IntentService**:IntentService是一个单线程的服务,适用于执行单一任务或者一系列互相独立的任务。当所有任务执行完毕后,IntentService会自动停止,避免了资源浪费。 4. **ThreadPoolExecutor**:这是Java...

    深度挖掘.NET Framework 2.0系列课程(2)ASP.NET 2.0中的异步页面

    1. 异步操作方法:为了执行异步操作,开发者需要创建一个或多个方法,这些方法将作为异步操作的实际工作单元。这些方法通常标记为`Async`,并返回`IAsyncResult`。 2. 注册回调方法:在`BeginProcessRequest`方法中...

    Android异步操作数据库

    Android提供了一个内置的异步任务类`AsyncTask`,适用于短时间的后台操作。你可以创建一个`AsyncTask`子类,将数据库操作放入`doInBackground()`方法中,然后在`onPostExecute()`方法中更新UI。这样,数据库操作...

Global site tag (gtag.js) - Google Analytics