Java实现异步非阻塞
异步非阻塞
项目开发需要及框架限制,只能手写一个异步非阻塞的方法。留档方便以后自用。
import java.util.HashMap;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class test {
public static void main(String[] args) throws InterruptedException {
Worker<String> worker = new Programmer();
// 调用任务对象(即唤起Batch运行)
worker.doNext(new Programming(worker));
// 主线程先返回状态
System.out.println("主线程结束");
}
}
class AtomThreadPool{
//static 对应bytecode <cinit> JVM保证线程安全
//什么懒加载单例模式,其实就是因为这个原因,线程安全.
// 设置新创建一个线程
private static ExecutorService es = Executors.newFixedThreadPool(1);
public static synchronized void add(Runnable r){
es = Executors.newFixedThreadPool(1);
es.execute(r);
}
public static synchronized void stop(){
es.shutdown();
}
}
/**
* 完成任务接口
* @author zhang.bin
* @param <T>
*/
interface CompletionMission<T>{
void doWork(T t);
}
/**
* 执行任务的 执行者
* @author zhang.bin
* @param <T>
*/
abstract class Worker<T>{
public abstract void doNext(CompletionMission<T> nextTask);
}
class Programming implements CompletionMission<String>{
private Worker<String> worker;
public Programming(Worker<String> worker) {
this.worker = worker;
}
@Override
public void doWork(String t) {
//函数之间的相互递归调用,如果没有在方法中设置终止条件,就会很容易栈overflow!
System.out.println("子线程开始运行");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
System.out.println("子线程结束运行");
AtomThreadPool.stop();
}
}
}
class Programmer extends Worker<String>{
@Override
public void doNext(final CompletionMission<String> nextTask) {
//以下直接执行过去,不会阻塞,不管run执行不执行,相当于异步.
//把任务交给线程池管理,不会使线程超标(超过OS最大线程数),而出现异常.
AtomThreadPool.add(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
nextTask.doWork("参数");
}
});
}
}
如需转载请声明出处