面试问题:
2020-11-23到2020-11-30
程序:为了完成特点任务,用某种语言编写的一组指令的集合。即一段静态的代码。
进程:正在运行的一个程序
进程可进一步细化为线程,是一个程序内部的一条执行路径。
每个线程拥有独立的运行栈和程序计数器
多个线程,共享同一个进程中的结果:方法区和堆。
单核CPU:假的多线程
java.exe至少有三个线程: main() gc()垃圾回收线程 处理异常线程
并行:多个CPU同时执行多个任务
并发:一个CPU同时(看似同时)执行多个任务
解决线程安全问题是? 3种方法。
创建线程? 4种方式。
线程
创建线程
继承于thread类 声明Thread类的子类,重写Thread类中的run方法 ;create 一个子类对象,用对象调用start方法
注两个问题:不调用start方法只调用run方法不能启动多线程
启动线程后,如何再启动一个线程?
new一个新对象 t2.start
比较创建线程的两种方式:
(继承具有局限性;java单继承机制)
开发中:优先选择:实现Runnable接口的方式
原因 1. 实现的方式没有类的单继承性的局限性。
2.实现的方式更适合来处理多个线程有共享数据的情况。
联系:Thread类中也有Runnable
421测试线程中的常用方法:
- start(): 启动当前线程,调用当前线程的run()
- run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中。
- currentThread(): 静态方法 返回当前代码执行的线程
- getName(): 获取当前线程的名
- setName(): 设置当前线程名(start之前)
- yield(): 释放当前CPU的执行权
- join(): 在线程A中调用线程B的join方法,此时线程A进入阻塞状态,直到线程B完成执行后,线程B才结束阻塞状态
- sleep(long millis time) 让当前线程睡眠,指定的毫秒,在毫秒时间内 当前线程为阻塞状态。应用于倒计时
- isAlive(): 判断线程是否存活。
线程的调度:高优先级的线程抢占CPU
1.getpriority() 获取线程
2. setpriority():设置线程优先级(优先级高并不一定先执行)
线程的通信:wait() / notify() / notifyall(): 次三方法定义在Object类中。
JAVA中的线程分为两类?: 一种是守护线程(依赖于用户线程),一种是用户线程(主线程)
线程的生命周期
新建;调用start方法后进入就绪;
就绪;获取CPU执行权之后进入运行;
运行;失去CPU执行权或Yield()进入就绪;
阻塞;不是线程的最终状态;
死亡;运行到死亡–》执行完run(), stop();出现错误和异常且没处理;
线程的同步:
多个线程执行的不确定性会引起执行结果的不稳定;
多个线程对数据库的共享,会造成操作的不完整性,会破坏数据
安全问题的出现就是因为共享数据;
问题:例如卖票系统中出现了重票,错票的现象;
当某个线程操作时,还没完成时,另一个操作参与进来也进行操作。
如何解决:当一个线程A在操作时,其他线程不能参与进来,直到线程A操作完,其他线程才可以操作,即使线程A被阻塞,也不能被改变。433