第一阶段:Java多线程集成知识
1.Java多线程介绍
CPU
线程 CPU调度,比进程粒度更小,协程,【进程内】相对独立的【单元】、多核CPU
进程
3、线程创建与启动以及线程的状态
- 继承(extends)
java.lang.Thread
类; - 实现(implements)
java.lang.Runnable
接口;
线程
1)Java应用程序的main函数是一个线程,是被JVM启动的时候调用,线程的名字叫main(main是一个非守护线程),JVM还会启动一下守护线程(GC等)
2)实现一个线程必须创建Thread实例,override run方法,并且调用start方法
3)在JVM启动后实际上有多个线程,但至少有一个非守护线程
4)当你调用一个线程start方法的时候,此时至少有俩个线程,一个是调用你的线程,还有一个执行run方法的线程
5)线程的生命周期分为new、runnbale、running、block、termate.
线程的生命周期
JVM虚拟机
4.Runbale接口详细介绍
线程Thread的构造器
0)创建线程对象Thread,默认有一个线程名,以Thread-开头,从0开始计数
/* For autonumbering anonymous threads. */
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
1)如果在构造Thread的时候没有船体Runnable或者没有复写Th're'ad的run方法,该Thread将不会调用任何东西,如果传递了Runnbale接口的实例,或者复写了Thread的run方法,则会执行该方法的逻辑单元(逻辑代码)
2)如果在构造Thread的时候没有传入Runnable或者没有复写Thread的run方法,该Thread将不会调用任何东西,如果传递了Runnbale接口的实例,或者复写了Thread的run方法,则会执行该方法的逻辑单元(逻辑代码)
3)如果构造线程对象时未传入ThreadGroup,Thread会默认获取父线程的ThreadGroup,作为该线程的ThreadGroup
此时子线程和父线程将会在同一个threadGroup中
4、构造Thread的时候传入stacksize代表着该线程占用的stack大小,如果没有指定stacksize,默认时0,0代表忽略该参数,该参数会被JNI函数取使用
需要注意:该参数在有一些平台有效,有些平台无效
-Xas10M
jconsole、jscode、汇编语言、jsp
join
synchromzied
class锁
死锁
notify()、notifyAll()、wait() Object
线程中的通讯
The difference of sleep and wait
1)sleep is the method of Thread,but the wait is the method of Object.
2)sleep will not release the object monitor(Lock),but the wait will be release the monitor and add to the Object monitor waiting queue.
3)use sleep not depend on the monitor,but wait need.
4)The sleep method not need be wakeup,but wait need.(wait(10))
综合实例
多线程数据采集、applcation应用 stacksize(上下文切换,导致性能差,线程太多)
synchronized锁不可打断(block),其他线程抢不到这个锁
自定义锁Lock
Linux(Hook)
javac ExitCapture.java
java -cp . ExitCapture
nohup java -cp . ExitCapture &
tail -f nohup.out
ps -ef | grep ExitCapture
root 17421 9383 0 13:59 pts/0 00:00:00 java -cp . ExitCapture
kill 17421
线程中如何捕获异常
RuntimeException导致线程挂掉
ThreadGroup 线程组(jdk1.4,jdk1.5版本之前管理线程组) API
线程池
一个请求,一个线程只处理一个任务,经历整个线程的生命周期,比较浪费资源,
线程池,一个线程完成一个任务回归到线程池里
1、任务队列
2、拒绝策略(抛出异常(保护程序的一种方式,处理能力、性能)、直接丢弃、阻塞、临时队列)
3、init
4、active
5、max
批量执行,异步执行
min>=active>=max
quartz(自己定义的线程池)定时任务、Control-M
Concurrency Programming in Action(The second phase--Multi-threaded design patterns)