package com.weigu.xiaochuang.project;
import com.google.common.util.concurrent.*;
import java.util.concurrent.*;
/**
* 线程异步处理
* 并发处理是通过多线程完成的,那么既然是多线程完成的,那就有处理线程的方法
*/
public class sync {
/**
* 分清两个概念:
* 任务:实现runnable接口是一个任务,这个任务中的run方法就是具体实现的任务,
* 线程:把任务通过构造函数的作用(),来启动一个线程
* 那么怎么样才能出现多线程的环境呢?
* 可以通过死循环的方式,去实现多线程
* 那么为什么?
* thread需要调Start方法启动线程,而线程池通过submit方法就可以启动一个线程();
* 多线程是用来处理任务的,也就是说Thread和线程池中装的一定是任务,而这个任务有不同的实现方式
* 业务逻辑和延迟搞清楚
*/
public String getRunnable() throws ExecutionException, InterruptedException {
// new Thread(new Runnable() {
// @Override
// public void run() {
// while (true) {
//
// }
// }
// }).start();
// return "";
ExecutorService executorService = Executors.newCachedThreadPool();
Callable callableTask = new Callable() {
@Override
public String call() throws Exception {
//TODO线程代码
return "";
}
};
Future<String> submit = executorService.submit(callableTask);
String result = submit.get();
executorService.shutdown();
return "";
}
/**
* list转map
* map的排序处理
* jsonObject的护理
* 异步处理
* 线程处理
* 多线程,主线程
*
* @param args
*/
public static void main(String[] args) {
ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
//开启一个线程
//此时存在两个线程,主线程和暂时开启的线程,然后主线程继续往下执行,不走当前线程的方法,当前
//线程是为了处理相应的业务逻辑,这个才是代码的核心,不是简单的增删改查
//也就是说:如果不开启线程,至少有一个线程,如果加了for循环就是多线程环境
//那么主线程什么时候阻塞.....这个就是异步,也就是说多线程本身就是异步执行的;
ListenableFuture<String> future = pool.submit(new Callable<String>() {
@Override
public String call() throws Exception {
//业务逻辑暂时用休眠代替
Thread.sleep(1000 * 2);
return "task done";
}
});
Futures.addCallback(future, new FutureCallback<String>() {
@Override
public void onSuccess(String result) {
//回调执行的结果,就是上述返回的数据,对于大数据量而言不用阻塞
System.out.println(result);
}
@Override
public void onFailure(Throwable throwable) {
//失败的原因
throwable.printStackTrace();
}
});
pool.shutdown();
}
}