java 多线程

  • 线程的状态:New、Runnable、Blocked、Waiting、Timed waiting、Terminated

  new Thread()——> New、 start()——> Runnable、 等待资源——>Blocked、wait()——> waiting 等

  • 锁:ReentrantLock, 条件对象:Condition
  • synchronized

  每个Object对象都有一个内部锁,synchronized关键字实际使用的就是内部锁,直接使用的wait()方法实际使用的是对象内部锁的条件。

  wait()——notifyAll——notify  对应  Condition.await()——Condition.signalAll()——Condition.signal()

  synchronized(obj){......} 获取的是obj的内部锁

  •   Volatile

  1.  修饰变量可见性,即主内存和工作内存同步

  2.  阻止相关字节码重排序

  •   new ThreadLocal<T>(){    T initialValue(){}} 为每个线程构造其局部对象
  • tryLock() 申请一个锁,成功返回true,否则立即返回false。可以传入超时参数
  • ReentrantReadWriteLock  读写锁,多线程读,少线程写很有用。拆分成读锁 readLock()和写锁writeLock()使用。
  • 阻塞队列 通过队列的方式分成生产线程和消费线程
  • java.util.concurrent 包中包含线程安全的集合,例如ConcurrentHashMap、ConcurrentLinkedQueue等 
  • Callable  and Future

  Callable 区别于Runnable, 其可以返回计算结果Future对象,也可以抛出异常。

  可以用 FutureTask包装Callable接口的对象,即

Callable<Integer> myComputation = ...; 
FutureTask<Integer> task = new FutureTask<Integer>(myComputation); 
Thread t = new Thread(task); 
t.start();
....;
Integer result = task.get();
  • 线程池

  Executor类工厂方法 :

newCachedThreadPool()   必要时创建新线程,空闲线程保留60秒
  newFixedThreadPool()   该池包含固定数量的线程,空闲线程会一直保留
  newSingleThreadExecutor()   只有一个线程的池,顺序执行每一个提交的任务
  newScheduledThreadPool   用于预定执行而构建的固定线程池,代替java.util.Timer
  newSingleThreadScheduledExecutor()   用于预定执行而构建的单线程池

 前三个返回实现了ExecutorService接口的ThreadPoolExecutor对象,使用submit(Runnable)或submit(Callable)提交任务

后两个返回实现ScheduledExecutorService接口的对象,可以定时或周期执行任务。

  • 控制任务组    ExecutorCompletionService
  • Fork-Join框架

 

posted @ 2022-09-30 11:35  迷路的圆  阅读(19)  评论(0编辑  收藏  举报