Goolge-Guava Concurrent中的Service,一般翻译作服务,个人感觉这个太宽泛了,我在学习中就直接把它当做一种特殊的线程托管对象来理解的。

一个服务正常生命周期有:

  • Service.State.NEW
  • Service.State.STARTING
  • Service.State.RUNNING
  • Service.State.STOPPING
  • Service.State.TERMINATED

服务一旦被停止就无法再重新启动了。如果服务在starting、running、stopping状态出现问题、会进入Service.State.FAILED.状态。调用startAsync()方法可以异步开启一个服务,同时返回this对象形成方法调用链。注意:只有在当前服务的状态是NEW时才能调用startAsync()方法,因此最好在应用中有一个统一的地方初始化相关服务。停止一个服务也是类似的、使用异步方法stopAsync()。但是不像startAsync(),多次调用这个方法是安全的。这是为了方便处理关闭服务时候的锁竞争问题。
阅读全文

ListenableFuture

ListenableFuture是可以监听的Future,它是对java原生Future的扩展增强。Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果希望计算完成时马上就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做会使得代码复杂,且效率低下。如果使用ListenableFuture,Guava会帮助检测Future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。
阅读全文

java线程有两个重要的特性,可见性有序性,多个线程之间是不能直接传递数据的,它们之间的交互只能通过共享变量实现。例如,对一堆数据进行求和运算,多个线程共享一个Sum类的对象,这个对象是被创建在主内存(堆)中,每个线程都有自己的工作内存(线程栈),工作内存存储了Sum对象的一个副本,当线程操作Sum对象时,首先从主内存中复制Sum对象到工作内存中,然后执行方法求和,改变sum值,最后用工作内存的Sum对象刷新主内存的Sum对象,当一个对象在多个线程中都有Sum对象的副本时,如果其中一个线程修改了共享变量,其它线程也应该能看见到,这是可见性。因为CPU对线程的调度是随机性的,在处理一些业务如银行转账时,必须保证先取款后汇款或先汇款后取款的有序操作,这是有序性
阅读全文

JDK1.5以后java加入了一个并发包java.util.concurrent用于替换传统的多线程使用场景。其中包含几个重要的接口Executor,ExecutorService,Future,Callable等。

Executor接口只定义了一个方法void execute(Runnable command),它用来执行提交的任务,用户只需提交任务,不必关心任务何时执行以及任务的调度情况。用户不需要明确的像传统方式那样定义一个线程,如:new Thread(new(RunnableTask())).start()。可以通过如下方式提交一个任务
阅读全文

  • 第 1 页 共 1 页

忘语

热爱生活,享受code


一名虔诚的程序猿