java多线程和异步回调

  在实际开发过程中遇到的java多线程情况不多,但是使用的组件,框架中则很多用到了多线程技术,java面试时也会考到,所以看看多线程的知识还是很有必要的。

  Thread,ThreadLocal, Runnable,Callable,Future,FutureTask,Executors这是java常见的接口和类。
 thread.run():线程具体要执行的代码,thread.join():等待该线程完成。

---------------------8/25-----------------------------

  写过一些程序后,回过头来看多线程,其实多线程涉及到内存读写,cpu等底层的东西,java语言也尽量帮我们封装和抽象,使其对于程序员能够简单些。多线程面临的主要挑战在于线程间的同步和共享变量的安全操作,其中java中有synchronized和volatile关键字,以及后面的Excutor框架。

  synchronized:给对象(或者代码块)加锁,使一个线程在访问时,其他线程等待,实现机制:jvm内置的锁
   volatile:在多线程中保证线程的可见性,具体机制主要是保证内存和缓存中的数据的一致性。

  java的并发操作中,主要在java.util.concurrent包中。

  比如常见的ScheduledExecutorService,简单来说,这是一个执行定时任务的线程,可以参考这篇博文:ScheduledExecutorService 延迟 / 周期执行线程池,这个类适合于在分布式系统中定时发送心跳的操作。同时还有个简单的Timer和TimerTask类:Java 计时器 Timer 与 定时任务 TimeTask,都是非常好的阅读材料。其用法简单一句话总结:timer.schedule(timeTask,0,60*1000)。

-----------------8/13--------------

 数据库连接池就使用了多线程的技术,数据库连接池基本是标配了,如c3p0,dbcp等,这已经成为比较成熟的技术,我之前也用过c3p0,现在有些忘了,我需要理解一下。应该看一下源码,能看懂一点是一点。

new ComboPooledDataSource();//空参,自动到classpath目录下面加载“c3p0-config.xml”配置文件---配置文件的存储位置和名称必须是这样,且使用“默认配置”

//ComboPooledDataSource pool = new ComboPooledDataSource("demo");//加载“c3p0-config.xml”文件中定义的“demo”这个配置元素

-------8/23-------

  我发现我对java多线程的认识还存在很大的误区。比如多线程的停止和程序的停止,调用一个函数,虽然看起来没有开启一个线程,其实很可能已经开启了。

开发框架比如Netty,大量使用异步回调ChannelFuture,自己实现异步回调比较苦难,但是JDK8提供了异步调用的类CompletableFuture,非常友好。

  CompletableFuture的使用:

    CompletableFuture future = CompletableFuture.allOf(futureOne, futureTwo);
    // 阻塞等待所有任务完成
    System.out.println(future.get());
    List<CompletableFuture<FileUploadDO>> futureList= request.stream().map(dto -> CompletableFuture.
    supplyAsync(() -> doUploadFile(dto.getFileId(),dto.getMathml()), executorService ))
    .collect(Collectors.toList()); 
    CompletableFuture<Void> completableFuture=CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]));
    // 像thread,阻塞等待线程完成
    completableFuture.join();

-------------------------2020/7/16

  java的多线程编程有一个常见的框架:Executor+CountDownLatch,一个用于执行任务,一个等待任务执行。这个小框架在写多任务的时候还是很常用的。

posted @ 2018-04-29 17:20  懂得了才能做一些改变  阅读(716)  评论(0编辑  收藏  举报