复习{
多线程:
程序: 什么是程序;
程序 = 数据结构 + 算法 + 编程语言;
在操作系统中安装的 软件,一套可执行文件,能够实现我们
所预期的任务;
进程: 进程就是 正在操作系统中 运行的程序;
什么是多进程?
运行在操作系统中的 多个 进程 ,那么就是多进程
进程和进程之间相互不干扰,每一个进程都占用操作系统的内存
有自己独立的运行空间;
线程: 什么是线程?
线程是进程上的 子程序流,它运行时会占用进程的内存;
多线程: 什么是多线程?
多线程是运行在 进程上的 多个子程序流,它们运行时会占用
进程的内存,线程和线程之间 运行 相互不干扰,是互斥的;
任何程序都是由线程的,java也不例外,一个java程序想要执行
它也必须有线程,就是main线程; 当程序启动时,它会执行main线程
执行任务; 也就是单线程执行
多线程的作用?
提高程序的执行效率, CPU 4核
那如何实现多线程?
1.继承Thread类 : Thread类 被称为 线程类
2.实现Runnable接口
3.实现Callable接口
提问: 为什么java中 提供实现多线程的方式有两种?
答: 因为java中 只持支 单继承
class B extends A implements Runnable
class B extends Thread 就继承不了A了}
Thread类的方法:
1. new Thread();
2. 方法
|-- run(); run方法是线程体 ,执行需要执行的任务
|-- start(); 用于启动线程的方法
|-- join(); 强行加入, 让当前正在运行的线程进入阻塞状态
直到这个调用join方法的线程执行完毕
|-- isDaemon(); 判断当前线程 是否是守护线程
什么是守护线程?
用于服务其他线程的线程 ,一般用于运行后台任务
它具有自动结束生命周期的能力,不受jvm虚拟机影响
普通线程 jvm进程结束,普通线程的生命周期就销毁了
守护线程则不会,GC 垃圾回收器就是一个 守护线程
当jvm虚拟机进程结束,GC依然会回收垃圾;
setDaemon(boolean flag);
|-- sleep(long l); 让线程进入阻塞状态,直到当前的休眠的时间片结束
当调用sleep方法的时候 他是不释放资源的
|-- isAlive(); 判断是否存活
|-- yield(); 让步 ,一般用于测试,会让线程直接进入 就绪状态
|-- getName();
setName();
|-- getId();
|-- getPrority(); 优先级 1 5 10
setPrority();
|-- currentThread(); 获取当前正在运行的线程
currentThread(); 静态方法
Thread t = Thread.currentThread();
sleep方法 和yield方法的区别?
1.sleep方法 有一场 , yield方法 没有异常
2.sleep方法有入参时间, yield方法没有
3.sleep方法会让线程进入 阻塞状态,yield方法会让线程进入就绪状态
4.sleep方法不考虑优先级,所以会让低优先级的线程 优先执行
yield方法考虑优先级,会让同等级,后更高优先级的线程先执行
5.sleep一般用于正式场景,yield一般用于测试;
案例: 迅雷下载
1. 多个线程执行 多个任务,自己执行自己的,相互不干扰
==========================================================
案例2:
资源进程问题: 多个线程 共享一个资源 会出现 资源竞争问题;
那么如何解决?
多线程中提供了一个东西,锁 同步锁synchronized
同步锁有两种形式:
1.同步代码块儿
synchronized(锁标记 对象){ 只要具备唯一性就行
需要执行的代码
}
只有一个线程 可以持有 当前锁标记
2.同步方法
public synchronized 返回值类型 catchApple(入参列表){
}
同步方法最常用; java很多类中 用的都是 同步方法
问题: 假设有 5个苹果,有两个小朋友去抢,如何实现程序?
5个苹果是资源,两个小朋友是 线程
=================================================================================
死锁问题:
编写一个哲学家就餐问题的模拟程序(要求解决死锁的问题)
会出现死锁 , 死锁 是我们在使用 同步锁时, 对于锁的使用不当
导致程序 无法继续向下执行的现象,就是 死锁
各自持有 各自的 资源不释放,那么就死锁了
解决死锁的 办法 就是在编写程序时,注意适当的 释放锁资源
案例: 多个线程 共享 多个 资源
编写一个程序 ,完成哲学家就餐问题:
1.筷子 、 资源 三只 筷子
2.哲学家 、 线程 三个哲学家
死锁是程序执行时的一种现象, 是应为没有适当的释放锁资源导致的;
如何解决死锁,就是适当的释放锁资源;
三个综合案例:
1.一个线程处理 一个任务,相互不干扰,执行完毕 后 销毁了
2.多个线程共享 一个资源 ,会出现资源竞争问题, 必须使用同步锁synchronized解决
3.因为有了 synchronized ,所以程序中会出现 死锁现象;
多个线程共享 多个资源的时候,使用到了synchronized ,导致出现了死锁现象
释放的释放锁啊
==============================================================================
线程之间的通讯
实现Callable接口