《Java多线程编程核心技术》
百度网盘链接:https://pan.baidu.com/s/10FAGYsf238pN26-2P6Mxuw
提取码:i0tf
关键技术点
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();
能停止的线程-暴力停止
stop()与java.lang.ThreadDeath异常
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 方法
1.10线程的优先级
java中线程的优先级分为1~10这10个等级
this.getPriority();
线程优先级的继承特性
优先级具有规则性
thread1.setPriority(1)
thread2.setPriority(10)
高优先级线程总是大部分先执行完
优先级具有随机性
1.11 守护线程
用户线程和守护线程,典型的守护线程,垃圾回收线程
thread.setDaemon(true); // 设置为守护线程