《Java多线程编程核心技术》
百度网盘链接:https://pan.baidu.com/s/10FAGYsf238pN26-2P6Mxuw
提取码:i0tf

image.png


关键技术点

线程启动
使线程暂停、停止
线程优先级
线程安全相关问题

1.1 进程和多线程的概念及线程的优点

进程:操作系统结构的基础,是一次程序的执行,是系统资源分配和调度的一个独立单位。
线程:进程中独立运行的子任务。
多线程优点:最大限度利用CPU空闲时间,提升系统运行效率,多线程是异步运行的,单线程的是同步运行的。

1.2 使用多线程

实现多线程编程方式:继承Thread类,实现Runnable接口

继承Thread类


public class MyThread extends Thread{

public void run(){
super.run();
System.out.println(“MyThread”);
}
}
线程执行具有随机性
执行start()方法顺序不代表线程启动顺序

实现Runnable接口

Runnable接口可以解决Java不支持多继承的问题
Thread.java类中8个构造函数,有两个可以传递Runnable接口
Thread(Runnable target)
Thread(Runnable target,String name)
Thread.java 类实现了Runnable接口,构造函数Thread(Thread target)

实例变量与线程安全

不共享数据
每个线程都有各自的变量
public void run(){
super.run();
while(count>0){
count—;
}

}
共享数据
多个线程可以访问一个变量
public void run(){
super.run();
count—; // 不用循环语句,使用同步后其他线程就没有运行机会了
}
线程不安全,i—(三步,取值、计算、赋值)

解决方案
使用同步synchronized解决,run方法加入synchronized关键字,加锁代码为“互斥区/临界区”

i— 与 System.out.println()的异常

public void run(){
System.out.println(“i=”+(i—)); // i— 由单独一行运行,改为在println方法中直接打印
}
println()方法内部是同步的,解决非线程安全问题使用同步方法

1.3 currentThread()方法

// 返回代码段正在被哪个线程调用
Thread.currentThread().getName();

main线程调用
MyThread thread=new MyThread();
thread.run();

Thread-0调用
thread.start();中的 run方法自动调用

1.4 isAlive 方法

// 判断当前线程是否处于活动状态,线程处于正在运行或准备开始运行的状态
this.isAlive();
Thread.currentThread().isAlive()

1.5 sleep()方法

// 在指定毫秒数内让当前“正在执行的线程”休眠(暂停执行) this.currentThread();

1.6 getId() 方法

// 取得线程的唯一标识
Thread.currentThread().getId();
main线程id=1

1.7 停止线程

停止一个正在运行的线程
java中有三种方法可以终止正在运行的线程
使用退出标志,
使用stop方法强行终止
使用interrupt 方法中断线程

停止不了的线程

this.interrupt(); // 没有停止线程

判断线程是否停止

this.interrupted(); // 测试当前线程 (运行this.interrupt()方法的线程), 具有清除状态功能
this.isInterrupted(); // 测试线程是否已经中断,不清楚状态标志

能停止的线程—异常法

run(){
if(this.interrupted()){
throw new InterruptedException();
}
}

在沉睡中停止

先sleep,再停止某一线程,会进入catch语句,并清除停止状态值
run(){
Thread.sleep(200000);
}
thread.start();
Thread.sleep(200);
thread.interrupt();

先停止,再sleep
run(){
Thread.sleep(200000);
}
thread.start();
thread.interrupt();

能停止的线程-暴力停止

thread.stop();

stop()与java.lang.ThreadDeath异常

stop()已经废弃,存在问题,对锁定对象进行解锁,导致数据不一致

释放锁的不良后果

强制stop导致数据不一致

使用return停止线程

run(){
if(this.isInterrupted()){
return
}
}

1.8 暂停线程

暂停线程意味着此线程还可以恢复运行

suspend与resume方法的使用

thread.suspend();
thread.resume();

suspend 与resume 方法的缺点—独占

synchronized 同步方法
System.out.println()方法,同步

suspend 与resume 方法的缺点—不同步

1.9 yield 方法

放弃当前CPU资源,让给其他任务去占用CPU执行时间

1.10线程的优先级

java中线程的优先级分为1~10这10个等级
this.getPriority();

线程优先级的继承特性

A线程启动B线程,B线程的优先级与A一样

优先级具有规则性

thread1.setPriority(1)
thread2.setPriority(10)
高优先级线程总是大部分先执行完

优先级具有随机性

1.11 守护线程

用户线程和守护线程,典型的守护线程,垃圾回收线程
thread.setDaemon(true); // 设置为守护线程