`
san586
  • 浏览: 132923 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

WEB框架中异步实现方案

阅读更多
异步解决方案中除了JMS,AJAX,DWR等外的简单选择,就是多线程(具体的就是这个包:java.util.concurrent)
为实现在WEB中需要执行一些耗时的操作,例如发发邮件之类,但是又不能影响前台页面的响应这种需求,多线程中列举2个程序来解决。分别是立即执行和计划任务式的执行,2种执行都是在主线程外另外建个线程,故不影响主线程。
package Executor;

import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*
 * MVC中的异步执行解决方案
 * @Author 三上
 */
public class SingleThreadExecutor {
	public static void main(String[] args) {
		try {
			// 创建一个单线程执行程序
			ExecutorService executorService = Executors
					.newSingleThreadExecutor();
			final Runnable beeper = new Runnable() {
				int count = 0;

				public void run() {
					System.out.println(new Date() + " beep " + (++count));
				}
			};
			for (int i = 0; i < 100; i++) {
				executorService.execute(beeper);
			}
			executorService.shutdown();
			System.out.println("我是主线程,先执行我");
		} catch (Exception e) {
		}
	}
}

package concurrent;

import static java.util.concurrent.TimeUnit.SECONDS;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
/*
 * ScheduledExecutorService 	一个 ExecutorService,可安排在给定的延迟后运行或定期执行的命令。
 * 要安排在某个以后的 Date 运行,可以使用:schedule(task, date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)。
 * 参考网址:http://www.kuqin.com/J2SE6-API/java/util/concurrent/ScheduledExecutorService.html
 */
public class TestScheduledThread {
	public static void job() {
		final ScheduledExecutorService scheduler = Executors
			 	.newScheduledThreadPool(2);
		final Runnable beeper = new Runnable() {
			int count = 0;
			public void run() {
				System.out.println(new Date() + " beep " + (++count));
			}
		};
		//Callable与Runnable得区别是,它有返回值
		Callable callable=new Callable(){
			int count = 0;
			public Object call() {
				System.out.println(new Date() + " callbeep " + (++count));
				return count;
			}
		};
		//1秒钟后运行,只执行1次
		final ScheduledFuture beeperHandle3 = scheduler.schedule(callable, 1, SECONDS);
		final ScheduledFuture beeperHandle4 = scheduler.schedule(beeper, 1, SECONDS);
		// 1秒钟后运行,并每隔2秒运行一次
		final ScheduledFuture beeperHandle = scheduler.scheduleAtFixedRate(
				beeper, 1, 2, SECONDS);
		// 2秒钟后运行,并每次在上次任务运行完后等待5秒后重新运行
		final ScheduledFuture beeperHandle2 = scheduler.scheduleWithFixedDelay(
				beeper, 2, 5, SECONDS);
		// 30秒后结束关闭任务,并且关闭Scheduler
		scheduler.schedule(new Runnable() {
			public void run() {
				beeperHandle.cancel(true);
				beeperHandle2.cancel(true);
				beeperHandle3.cancel(true);
				beeperHandle4.cancel(true);
				scheduler.shutdown();
			}
		}, 30, SECONDS);
	}

	public static void main(String[] args) {
		job();
		System.out.println("我这个执行完了,但是后面还有");
	}
}

如果要求发完邮件后,能在前台显示“已发送完成”,那么就用下面这个:
package concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class TestFutureTask {
	public static void main(String[] args) throws InterruptedException,
			ExecutionException, TimeoutException {
		final ExecutorService exec = Executors.newFixedThreadPool(5);
		Callable call = new Callable() {
			public String call() throws Exception {
				Thread.sleep(1000 * 5);
				return "Other less important but longtime things.";
			}
		};
		Future task = exec.submit(call);
		// 重要的事情
		Thread.sleep(1000 * 3);
		System.out.println("Let’s do important things.");
		// 其他不重要的事情(比如发邮件等),30秒内如果不执行完,就返回null
		Object obj = task.get(30,TimeUnit.SECONDS);
		System.out.println(obj);
		// 关闭线程池
		exec.shutdown();
	}
}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics