Java基础--多线程基础
1.进程与线程
我们所编写的程序是一个静态的概念,而进程是指我们把程序运行起来以后,当程序启动以后就会启动一个进程,操作系统会给这个进程分配内存空间。
所以说进程是一个动态过程,有产生,存在和消亡的过程。
线程由进程创建。一个进程,可以拥有多个线程。
2.并发和并行
单核并发 多核CPU可以实现并行。
3.线程的中断与终止
线程方法中有个interrupt是中断异常,比如说中断线程的休眠而非终止这个thread。
4.线程的生命周期
thread的生命周期6种或者7种。原因是runnable状态被细化为了ready和running状态。
new ---runnable(ready-running)---Teminated
---timewaiting/waiting/blocked
5.创建线程的方法
{
1.继承Thread类,重写run方法,由于继承机制,类对象可以直接调用start方法开启线程,简单易用
2.更本质一点,实现Runnable接口,重写run方法,此时类对象没有start可以调用,怎么办?
// 底层实现静态代理---设计模式【代理模式】好好理解下哦
//thread类已经给你准备好构造器了,
// 可以接收一个实现Runnable接口的类对象,
// 然后thread帮它去实现(类似与代理买票)
实例:主程序psvm{
A a = new A;
Thread thread = new Thread(a);
thread.start();
}
class A implements Runnable{
@Override
run方法;
}
一般更推荐使用2:直接实现Runnable接口,由于java单继承机制,防止1方法不可用,同时Runnable机制可以让让多个线程共享一个资源,多个线程实现一个功能
}
6.*关于创建线程的start方法
创建的线程的类对象不直接调用它里面的run方法,而是使用start方法。这个start方法本质是调用一个native的 Start0方法,本地方法是jvm来调用的。底层是C/C++实现的。
7.多线程执行
主线程与子线程之间体现一种交替执行的状态,就是去执行start方法的时候,main thread不会等待他执行完毕在执行,main thread不会阻塞。这俩哥俩各走各的,不会因为一个先走完就另一个不走了。
yield方法:礼让,让某某线程先执行,不一定成功,当资源充足时,礼让很有可能不成功(cpu觉得它能行,顾得过来)
join方法:让某某线程插入进来先执行完成,我再执行。
8.线程终止-通知的方式
想在一个线程中控制另一个线程终止,可以通过在另一个线程中设置一个变量(可以是boolean)来控制,当你想要让其终止时,通过改变变量来通知它实现需求。
9.用户线程与守护线程
用户线程:工作线程,执行完成或通知结束
守护线程:所有用户线程结束后结束
eg:类对象.setDaemon(true); 类对象.start();设置进程为守护进程,先设置好属性再Start,否则会有异常。
10.经典售票问题--线程同步机制
关键字:Synchronized---互斥锁
核心:对一些敏感数据上锁,同一时间只能有一个线程访问,保证数据的完整性
方式:1.同步代码块 Synchronized (对象){需要同步的代码}
2.同步方法 public Synchronized void m方法(){}
11.线程死锁与释放锁
死锁:线程之间互不相让,拿了对方需要的,谁也动不了死锁
释放锁:挂起,礼让yield,和sleep不会释放锁,结合线程的生命周期来理解,比如说yield操作发生在runnable(ready-running)中,所以不会释放锁
可以释放的情况:Synchronized执行结束了,执行Synchronized中遇到return、break,error,exception了,执行Synchronized中执行了wait方法,当前线程暂停并释放锁。
12.补充工具
JConsole可以监控thread执行情况,可以更加直观的感受线程的生命周期。

浙公网安备 33010602011771号