Java并发程序设计教程
温绍锦
旧时王谢堂前燕,飞入寻常百姓家。
邮箱:szujobs@hotmail.com
旺旺:shaojinwensj
QQ:1420452
Blog:http://www.cnblogs.com/jobs/
版本:2010-08-09
内容列表
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、定时器:ScheduledExecutorService、大规模定时器TimerWheel
9、并发三大定律:Amdahl、Gustafson、Sun-Ni
10、神人和图书、相关网络资源
11、业界发展情况:GPGPU、OpenCL
12、复习题
学习的过程,着重注意红星标识☆的内容,学完之后,要求能够回
答复习题。
启动线程的注意事项
无论何种方式,启动一个线程,就要给它一个名字!这对排错诊断
系统监控有帮助。否则诊断问题时,无法直观知道某个线程的用途。
Threadthread=newThread("threadname"){
publicvoidrun(){
//doxxx
}
};
thread.start();
Threadthread=newThread(){
publicvoidrun(){
//doxxx
}
};
thread.setName("threadname");
thread.start();
publicclassMyThreadextendsThread{
publicMyThread(){
super("threadname");
}
publicvoidrun(){
//doxxx
}
}
MyThreadthread=newMyThread();
thread.start();
Threadthread=newThread(task);//传入任务
thread.setName(“threadname");
thread.start();
Threadthread=newThread(task,“threadname");
thread.start();
13
24
5
要响应线程中断
程序应该对线程中断作出恰当的响应。
Threadthread=newThread("interrupttest"){
publicvoidrun(){
for(;;){
doXXX();
if(Thread.interrupted()){
break;
}
}
}
};
thread.start();
Threadthread=newThread("interrupttest"){
publicvoidrun(){
for(;;){
try{
doXXX();
}catch(InterruptedExceptione){
break;
}catch(Exceptione){
//handleException
}
}
}
};
thread.start();publicvoidfoo()throwsInterruptedException{
if(Thread.interrupted()){
thrownewInterruptedException();
}
}
1
2
3
thread.interrupt();
ThreadLocal
ThreadLocal
initialValue():T
get():T
set(Tvalue)
remove()
顾名思义它是localvariable(线程局部变量)。它的功用非
常简单,就是为每一个使用该变量的线程都提供一个变量值
的副本,是每一个线程都可以独立地改变自己的副本,而不
会和其它线程的副本冲突。从线程的角度看,就好像每一个
线程都完全拥有该变量。
使用场景
Tokeepstatewithathread(user-id,transaction-id,logging-id)
Tocacheobjectswhichyouneedfrequently
隐式传参
注意:使用ThreadLocal,一般都是声明在静态变量中,如果不断的
创建ThreadLocal而且没有调用其remove方法,将会导致内存泄露。
同时请注意,如果是static的ThreadLocal,一般不需要调用remove。
ExecutorService
Executor
Thread
Executor
Thread
Executor
Thread
TaskTaskTaskTaskTask
TaskSubmitter
任务的提交者和执行者
TaskSubmitter
TaskSubmitter
为了方便并发执行任务,出现了一种专门用来执行任务的实现,也就是Executor。
由此,任务提交者不需要再创建管理线程,使用更方便,也减少了开销。
java.util.concurrent.Executors是Executor的工厂类,通过Executors可以创建你所需要的
Executor。
TaskExecutorTaskSubmitter
任务的提交者和执行者之间的通讯手段
ExecutorServiceexecutor=Executors.newSingleThreadExecutor();
Callable |
|