千锋逆战班学习第28天
千锋逆战班学习第28天
努力或许没有收获,但不努力一定没收获,加油。
今天我学了Java课程的异常。
中国加油!!!武汉加油!!!千锋加油!!!我自己加油!!!
总结-多线程
- 进程:
- 什么是进程:程序是静止的,只有真正运行时的程序,才被称为进程。
- 单核CPU在任何时间点上,只能运行一个进程。
- 宏观并行、微观串行。
- 查询几核:
- 右键我的电脑属性,设备管理器,然后处理器。
- wmic
- cpu get NumberOfCores
- 线程:
- 线程,又称轻量级进程(Light Weight Process)。
- 程序中的一个顺序控制流程,同时也是CPU的基本调度单位。
- 进程有多个线程组成,彼此间完成不同的工作,交替执行,称为多线程。
- 线程的组成:
- 任何一个线程都具有基本的组成部分:
- CPU时间片:操作系统(OS)会为每个线程分配执行时间。
- 线程的逻辑代码。
- 运行数据:
- 堆空间:存储线程需使用的对象,多个线程可以共享堆中的对象。
- 栈空间:存储线程需使用的局部变量,每个线程都拥有独立的栈。
- 创建线程
- 创建线程的第一种方法:
(1)继承Thread类。
(2)覆盖run( )方法。
(3)创建子类对象。
(4)调用start( )方法。 - 创建线程的第二种方法:
(1)实现Runnable接口。
(2)覆盖run( )方法。
(3)创建实现类对象。
(4)创建线程对象。
(5)调用start( )方法。
- 线程的状态(基本):
- 常见方法:
- 休眠(有限期等待):
- public static void sleep( long millis)
- 当前线程休眠millis毫秒。
- 放弃:
- public static void yield()
- 当前线程主动放弃时间片,回到就绪状态,竞争下一次时间片。
- 结合(加入)(无限期等待):
- public final void join()
- 等待条件为调用join方法的线程执行完毕后,在进入就绪状态,竞争时间片。
- 线程安全问题:
- 线程不安全:
- 当多线程并发访问临界资源(共享资源)时,如果破坏原子操作,可能会造成数据不一致。
- 临界资源:共享资源(同一资源),一次仅允许一个线程使用,才可保证其正确性。
- 原子操作:不可分割的多步操作,被视作一个整体,其顺序和步骤不可打乱或缺省。
- 同步:
- 同步代码块:
Synchronized(临界资源对象){//临界对象加锁(谁拿到锁,谁不会被打断)
//代码
}
注:
每个对象都有一个互斥锁标记,用来分配给线程的。
只有拥有对象互斥锁标记的线程,才能进入对该对象加锁的同步代码块。
线程退出同步代码块时,会释放相应的互斥锁标记。
- 线程的状态(阻塞)
Question_12_1
1.一个单CPU 的机器,如何同时执行多个线程?请简述其原理。
答:操作系统(OS)会为每个线程分配CPU时间片,来同时执行多个线程
Question_12_2
有以下代码
public class Example implements Runnable{
public void run() {
while(true) {
}
}
public static void main(String args[]) {
Example ex1 = new Example();
Example ex2 = new Example();
Example ex3 = new Example();
ex1.run();
ex2.run();
ex3.run();
}
}
选择正确答案:
A.代码编译失败,因为 ex2.run()无法获得执行
B.代码编译成功,存在 3 个可运行的线程
C.代码编译成功,存在 1 个可运行的线程
答:C,
Example ex1 = new Example(); Example ex2 = new Example(); Example ex3 = new Example(); 只是创建了三个任务类,并非线程,只有main()一个线程。