## 并发编程
### 查看进程和线程
#### linux
进程
```
ps -fe //查看java进程
ps -fe | gropu java //使用管道运算符筛选java进程
jps //jdk自带命令,查看进程windows也可用
kill pidxxx //杀掉进程
```
线程
```
top -H -p pidxxx //查看进程下的所有线程
jstack pidxxx //抓取某一刻的线程信息
```
#### 栈与栈帧
main线程运行时内存图,栈是线程私有的,所以此处只给线程main分配一个栈
#### 线程上下文切换
即多个线程轮流使用cpu,每次切换,线程计数器都要记录他的线程执行到那一步了。
#### 常见方法
##### join
join方法一般用于线程间通信 ,**底层原理是wait **
```java
main{
t.join(); //在main线程中调用t的join,也就是说当t运行结束后main就运行
}
```
```java
main{
t1.join();
t2.join();
//当t1和t2中运行最慢的结束后可以运行,t1和t2可以并行运行
}
```
等待的时间已时间运行的时间为准
```
main{
t.join(10); //如果t运行只花了3s,那么main线程3s后就会运行,如果运行时间超过10s,例如15s,那么就mian就在10s后运行
}
```
##### interrept
1、打断睡眠的线程和正常的线程
非睡眠状态下打断线程后打断标志为true,但线程继续运行
2、两阶段中断异常
3、isInterrupted()和interrupted()
前者不会清除打断标志,后者会清除
4、park
LockSupport.park();//当前线程阻塞 ,当使用interrupt打断时可以继续运行,**打断标记为正时park失效**
#### 主线程与守护线程
一般情况下当线程运行结束后进程才会结束,对于守护线程来说当其他线程运行结束后只剩守护线程时进程也会结束