基础技术部牛路《Java多线程入阶分享》纯干货

所需积分/C币:10 2017-12-22 11:20:45 773KB PDF
11
收藏 收藏
举报

Java多线程入阶干货分享 1.使用线程的经验:设置名称、响应中断、使用ThreadLocal 2.Executor:ExecutorService和Future 3.阻塞队列:put和take、offer和poll、drainTo 4.线程间通信:lock、condition、wait、notify、notifyAll 5.Lock-free:atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList 6.关于锁的经验介绍 7.并发流程控制手段:CountDownLatch、Barrier 8.定时器:ScheduledExecutorServ
启动线程的注意事项 2 传入任务 threadsetName "thread name") Thread thread= new Thread(task, thread name"); 无论何种方式,启动一个线程,就需要给它一个名字!这对排错诊断系统有帮助。 否则诊断问题时,无法直观知道某个线程的用途。 Badu百度 要响应线程中断 thread interrupt Thread thread= new Thread(interrupt test I publicvoidrun([ for(,)[ doXXXO 3 catch(Interrupted EXception)[ break: 3 catch(Exception e)i // handle exception hread start( 程序应该对线程中断作出恰当的响应。 Badu百度 Threadlocal Threadlocak<t> 顾名思义它是 local variable(线程局部 变量)。它的功用非常简单,就是为每 个使用该变量的线程都提供一个变量 initialvalue(: T 值的副本,是每一个线程都可以独立地 geto: T 改变自己的副本,而不会和其它线程的 set(T value) 副本冲突。从线程的角度看,就好像每 remove 个线程都完全拥有该变量 使用场景 To keep state with a thread (user-id, transaction-id, logging-id To cache objects which you need frequently 隐式传参 注意:使用 Threadlocal,一般都是声明在静态变量中,如果不断的创建 Threadlocal而且没有调用其 remove方法,将会导致内存泄露。 同时请注意,如果是 static的 Threadlocal,一般不需要调用 remove Badu百度 任务的提交者和执行者 为了方便并发执行任务,出现了一种专门用来执行任务的实现,也就是 Executor 由此,任务提交者不需要再创建管理线程,使用更方便,也减少了开销。 Executor Service Task Submitter Executor Thread Executor Task Submitter Task Task Task Task Task Thread Executor Task Submitter Thread javautil. concurrent. Executors是 Executor的工厂类,通过 Executors 可以创建你所需要的 Executor。 Badu百度 任务的提交者和执行者之间的通讯手段 有两种任务: Runnable Callable 等待至完成 Callable是需要返回值的任务 等待到任务被执行完毕返回结果 如果任务执行出错,这里会抛 Object result 等待秒,超时后会抛 Task Submitter把任务提交给 Execute执行,他们之间需要一种通讯手 段,这种手段的具体实现,通常叫做 Future。 Future通常包括get(阻塞 至任务完成), cancel, get(timeout)(等待一段时间)等等。 Future 也用于异步变同步的场景。 Badu百度 阻塞队列 producer consumer ∥/如果队列满则阻塞 for ( eat blocking put(objectl blocking Q take();∥/如果队列空则阻塞 阻塞队列,是一种常用的并发数据结构,常用于生产者-消费者模式。 在Java中,有很多种阻塞队列: Array Blocking Queue 最常用 LinkedBlocking Queue 不会满的 SynchronousQueue size为0 Priority BlockingQueue Completion Service (Blocking Queue+ Executor) TransferQueue(DK7中更快的 SynchronousQueue) Badu百度 使用阻塞队列 Queue<E> 使用 BlockingQueue的时候,尽量不要使用从 Queue继承下来的方法,否则就失去了 Blocking的特性了。 在 BlockingQueue中,要使用pu和take,而非 ofer和pol!如果要使用ofer和po‖l,也是要 使用带等待时间参数的ofer和pol 使用 drainTo批量获得其中的内容,能够减少锁 的次数。 Badu百度 使用阻塞队列 杯具,不等待就会直接返回 等到有数据才继续 Badu百度

...展开详情
试读 32P 基础技术部牛路《Java多线程入阶分享》纯干货
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
  • 签到新秀

  • 分享精英

关注 私信
上传资源赚钱or赚积分
最新推荐
基础技术部牛路《Java多线程入阶分享》纯干货 10积分/C币 立即下载
1/32
基础技术部牛路《Java多线程入阶分享》纯干货第1页
基础技术部牛路《Java多线程入阶分享》纯干货第2页
基础技术部牛路《Java多线程入阶分享》纯干货第3页
基础技术部牛路《Java多线程入阶分享》纯干货第4页
基础技术部牛路《Java多线程入阶分享》纯干货第5页
基础技术部牛路《Java多线程入阶分享》纯干货第6页
基础技术部牛路《Java多线程入阶分享》纯干货第7页

试读结束, 可继续读3页

10积分/C币 立即下载 >