我是菜鸟:java中多线程机制笔记

来源:互联网 发布:nginx 模型 编辑:程序博客网 时间:2024/04/27 14:13

  • ThreadLocal的含义及用法
    • ThreadLocal内部机制
  • FuthureTask
    • FutureTask与Runnable 与Callable之间的关系
  • Executor

ThreadLocal的含义及用法

ThreadLocal类提供了一个线程本地的变量,这些变量必须通过get,set方法来访问,并且在被共享的情况下在不同的线程中是独立存在的。实际上就是在线程本地保存了一个变量,而不是通过共享。(这样数据岂不是不能够共享?)在该类中除了get,set方法外还有initValue()方法,顾名思义就是初始化变量的值,因此各个线程中访问的是不同的对象,并且每个对象是由线程中使用new操作来创建的,并非是对象的拷贝或者副本。(这样岂不是没有并发访问的问题出现??)

ThreadLocal内部机制

每个线程都有一个自己的map,通过ThreadLocal.set()将这个新创建的对象的引用保存到各线程的自己的一个map中,执行ThreadLocal.get()时,各线程从自己的map中取出放进去的对象,因此取出来的是各自自己线程中的对象,ThreadLocal实例是作为map的key来使用的。

总之,ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。归纳了两点:
1. 每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。
2. 将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。

FuthureTask

FuthureTask可取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。
FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的。三个状态:等待、运行和完成。
Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future

FutureTask与Runnable 与Callable之间的关系

  1. 单独使用Runnable时: 无法获得返回值
  2. 单独使用Callable时:无法在新线程中(new Thread(Runnable r))使用,只能使用ExecutorService。
    (Thread类只支持Runnable)
  3. FutureTask:实现了Runnable和Future,所以兼顾两者优点 既可以使用ExecutorService,也可以使用Thread。

Executor

public interface Executor——此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用 Executor 而不是显式地创建线程,简而言之执行器Executor管理Tread对象,简化并发编程。
Executor 在客户端和任务执行之间提供了一个简介层,这个中介对象将执行任务。Executor 允许管理异步任务的执行,而无须显示地管理线程的生命周期。
public interface ExecutorService
extends Executor,ExecutorService是具有服务生命周期的Executor。

0 0