死磕高并发与网络编程学习笔记及总结(一)

第一阶段: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)

猜你喜欢

转载自blog.csdn.net/weixin_39650971/article/details/93616548