这里写目录标题
关于进程和线程
- 进程:指程序中的每一个执行文件 exe 有独立的系统内存和资源
- 线程:指进程当中每一个独立的小任务 竞争关系
多线程优势
- 充分利用CPU资源
- 简化代码模型
- 提高用户体验度
主线程
- 定义:main函数统称为主线程 优先级–>5
使用多线程的步骤
- 定义线程(extends Thread 和 implements Runnable)
- 创建线程对象
- 调用start方法启动线程
- 关闭线程
//创建main
public static void main(String[] args) {
//创建线程对象
MyThread mt=new MyThread();
//启动线程
//单线程程序 只有main线程工作
mt.run();
//start:重新开始一个全新的线程 然后执行run方法
mt.start();
}
定义线程两种方式的对比
- Thread:资源各论各的
- Runnable:资源共享
线程的五个状态
- 创建状态:Thread t1 = new Thread(mt2);
- 就绪状态:启动线程以后,但是没有抢到CPU资源时
- 运行状态:线程抢到资源并且开始执行run方法时
- 阻塞状态:使用线程调度方法将线程转为阻塞状态
(a.吐出CPU资源+b.在指定时间内被冻结,没有资格去抢占资源) - 死亡状态:调度方法使线程死亡或者线程自然死亡
线程调度方法
- setPriortity:改变线程的优先级 改变线程抢占资源的概率 但是不绝对
- sleep(毫秒数):在指定时间内让当前线程释放CPU资源 转入阻塞状态
指定时间结束后转入就绪状态 和其他线程抢占资源 - join:让当前线程A暂停执行 将资源让给插队的线程B 当B完成执行以后在将资源还给A
- yield:线程礼让 让当前线程释放CPU资源 可以给其他线程提供机会 自己转入就是就绪状态继续和其他线程抢占资源
- interrupt():强行中断当前线程
- isAlive:判断某个线程是否处于活动状态
线程普通方法
- getPriority:获取当前线程的优先级
- getName:获取当前线程的名字
- setName:给当前线程设置名字
线程同步:确保在同一时刻只有一个线程访问当前资源
实现方式
- 线程方法:public synchronized void run() {}
- 同步代码块
public void run() {
synchronized(资源,一般是属性名称){代码块}
}
线程安全:实现线程同步的类被认为线程安全 否则不安全
- 安全:HashTable/StringBuffer
- 不安全:HashMap/StringBuilder
- ps:线程安全的效率低