completablefuture

ELK学习实验017:filebeat收集java日志

倖福魔咒の 提交于 2020-01-19 19:28:32
收集JAVA格式日志 1 查看Java格式日志 elasticsearch属于Java日志,可以收集elasticsearch作为Java日志范本 [root@node3 ~]# tail -f /usr/local/elasticsearch/logs/my-elktest-cluster.log [2020-01-19T01:57:18,496][INFO ][o.e.t.TransportService ] [node-3] publish_address {192.168.132.133:9300}, bound_addresses {[::]:9300} [2020-01-19T01:57:18,506][INFO ][o.e.b.BootstrapChecks ] [node-3] bound or publishing to a non-loopback address, enforcing bootstrap checks [2020-01-19T01:57:18,531][INFO ][o.e.c.c.Coordinator ] [node-3] cluster UUID [4xt-ZTijTz2oTnlz1gMFjg] [2020-01-19T01:57:19,195][INFO ][o.e.c.s.ClusterApplierService] [node-3]

Future模式之CompletableFuture

拈花ヽ惹草 提交于 2020-01-17 11:44:29
简书网站链接经常失效 https://www.jianshu.com/p/220d05525f27 CompletableFuture 是Java 8 新增加的Api,该类实现,Future和CompletionStage两个接口,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。 一、主动完成计算 public T get() 该方法为阻塞方法,会等待计算结果完成 public T get(long timeout,TimeUnit unit) 有时间限制的阻塞方法 public T getNow(T valueIfAbsent) 立即获取方法结果,如果没有计算结束则返回传的值 public T join() 和 get() 方法类似也是主动阻塞线程,等待计算结果。和get() 方法有细微的差别 public class ThreadUtil { public static void sleep(long ms) { try { Thread.sleep(ms); } catch (InterruptedException e) { e.printStackTrace(); throw new RuntimeException(e

Spring框架中的异步执行

时光怂恿深爱的人放手 提交于 2020-01-14 02:08:08
一、Spring框架中的异步执行 在Spring Framework中分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象,本节我们着重讲解基于TaskExecutor支撑的的注解@Async如何实现异步处理的。 二、 @Async注解异步处理原理 在Spring中可以在方法上添加@Async注释,以便异步调用该方法。换句话说,调用者将在调用含有@Async注释的方法时立即返回,并且该方法的实际执行将发生在Spring TaskExecutor异步处理器线程中。需要注意的是该注解@Async默认是不会解析的,SpringBoot中需要加上@EnableAsync来启动。 下面我们看如何使用@Async注解进行异步处理,如下代码: @Async public void dosomthingAsync() { System.out.println("--dosomthingAsync begin---"); // 模拟异步处理 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("--dosomthingAsync end---"); } 如上代码在方法dosomthingAsync上添加了

【并发编程】Future模式添加Callback及Promise 模式

给你一囗甜甜゛ 提交于 2020-01-13 05:47:02
Future Future是Java5增加的类,它用来描述一个异步计算的结果。你可以使用 isDone 方法检查计算是否完成,或者使用 get 方法阻塞住调用线程,直到计算完成返回结果。你也可以使用 cancel 方法停止任务的执行。下面来一个栗子: public class FutureDemo { public static void main(String[] args) { ExecutorService es = Executors.newFixedThreadPool(10); Future<Integer> f = es.submit(() ->{ Thread.sleep(10000); // 结果 return 100; }); // do something Integer result = f.get(); System.out.println(result); // while (f.isDone()) { // System.out.println(result); // } } } 在这个例子中,我们往线程池中提交了一个任务并立即返回了一个Future对象,接着可以做一些其他操作,最后利用它的 get 方法阻塞等待结果或 isDone 方法轮询等待结果(关于Future的原理可以参考之前的文章: 【并发编程】Future模式及JDK中的实现 )

Java8 CompletableFuture 编程

半腔热情 提交于 2019-12-20 12:57:59
一、简介  所谓异步调用其实就是实现一个无需等待被调用函数的返回值而让操作继续运行的方法。在 Java 语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结果。但调用者仍需要取线程的计算结果。  JDK5新增了 Future 接口,用于描述一个异步计算的结果。虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的 CPU 资源,而且也不能及时地得到计算结果。 private static final ExecutorService POOL = Executors.newFixedThreadPool(TASK_THRESHOLD, new ThreadFactory() { AtomicInteger atomicInteger = new AtomicInteger(0); @Override public Thread newThread(Runnable r) { return new Thread(r, "demo15-" + atomicInteger.incrementAndGet()); } }); public static void main(String[] args)

使用Spring的@Async创建异步方法

限于喜欢 提交于 2019-12-14 05:20:49
在开发系统的过程中,通常会考虑到系统的性能问题,提升系统性能的一个重要思想就是“串行”改“并行”。说起“并行”自然离不开“异步”,今天我们就来聊聊如何使用Spring的@Async的异步注解。 假设场景 你有一个很耗时的服务,我们在下面的例子中用线程休眠来模拟,服务执行需要5秒钟。假设一个请求需要调用这个服务3次,如果按照“串行”的方法,将至少需要15秒钟。那么为了提升系统的性能,我们采用“并行”的方法,我们最乐观的情况下,只需要5秒就可以了。有人可能会说这个很简单,我们写个多线程的方法就可以了。但是,今天我们看看Spring为我们提供的方法,它使得开发的过程更简单。 创建异步方法 首先,使用IDEA工具创建Spring-Boot项目,并且选择依赖包Lombok,具体步骤略。然后创建BusyService类,并创建busyMethod方法,具体如下: @Service @Slf4j public class BusyService { @Async publicCompletableFuture<String> busyMethod(String name) throws InterruptedException { log.info(name); Strings = "Hello,"+name+"!"; //模拟耗时操作,5秒 Thread.sleep(5000);

Java线程的JDK8对并发的新支持

孤街醉人 提交于 2019-12-11 09:41:59
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. LongAdder 和AtomicLong类似的使用方式,但是性能比AtomicLong更好。 LongAdder与AtomicLong都是使用了原子操作来提高性能。但是LongAdder在AtomicLong的基础上进行了热点分离,热点分离类似于有锁操作中的 减小锁粒度 ,将一个锁分离成若干个锁来提高性能。在无锁中,也可以用类似的方式来增加CAS的成功率,从而提高性能。 LongAdder原理图: AtomicLong的实现方式是内部有个value 变量,当多线程并发自增,自减时,均通过CAS 指令从机器指令级别操作保证并发的原子性。唯一会制约AtomicLong高效的原因是高并发,高并发意味着CAS的失败几率更高, 重试次数更多,越多线程重试,CAS失败几率又越高,变成恶性循环,AtomicLong效率降低。 而LongAdder将把一个value拆分成若干cell,把所有cell加起来,就是value。所以对LongAdder进行加减操作,只需要对不同的cell来操作,不同的线程对不同的cell进行CAS操作,CAS的成功率当然高了(试想一下3+2+1=6,一个线程3+1,另一个线程2+1,最后是8,LongAdder没有乘法除法的API)。 可是在并发数不是很高的情况,拆分成若干的cell

CompletableFuture异步编程

霸气de小男生 提交于 2019-12-07 02:44:31
CompletableFuture 有什么用 CompletableFuture是用来描述多线程任务的时序关系的:串行关系,并行关系,聚合关系。 CompletableFuture 是Java 8 新增加的Api,该类实现,Future和CompletionStage两个接口,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。 创建CompletableFuture对象 方式一:使用默认线程池 /** * 创建一个不带返回值得任务。 */ CompletableFuture<Void> f1 = CompletableFuture.runAsync(new Runnable() { @Override public void run() { //业务逻辑 } }); /** * 创建一个带返回值的任务。 */ CompletableFuture<String> f2 = CompletableFuture.supplyAsync(new Supplier<String>() { @Override public String get() { //业务逻辑 return null; } }); 方式二:使用自定义线程池(建议使用) /

CompletableFuture

依然范特西╮ 提交于 2019-12-05 14:42:53
public class CompletableFutureTest { public static void main(String[] args) throws Exception { // test2(); // test1(); // test3(); test4(); } //采用了callable+ future方式 public static void test1() throws Exception { ExecutorService executor = Executors.newCachedThreadPool(); Future<String> result = executor.submit(()->{ //模拟执行耗时任务 System.out.println("task doing..."); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //返回结果 return "result"; }); //这里只是将空闲的线程中断,将线程池的状态改为shutdown,不能继续往线程池中添加任务 executor.shutdown(); System.out.println("task运行结果" + result.get()); } /

Java 8 CompletableFuture , Stream and Timeouts

匿名 (未验证) 提交于 2019-12-03 02:23:02
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: i'm trying to process some amount of data concurrently using CompletableFuture and Stream So far i have: public static void main(String[] args) throws InterruptedException, ExecutionException { System.out.println("start"); List<String> collect = Stream.of("1", "2", "3", "4", "5", "6", "7") .map(x -> CompletableFuture.supplyAsync(getStringSupplier(x))) .collect(Collectors.toList()) .stream() .map(CompletableFuture::join) .collect(Collectors.toList()); System.out.println("stop out!"); } public static Supplier<String> getStringSupplier(String