【注】:转载至大佬智哥文档,仅做学习,略有删添
Thread
主要内容:进程、线程、区别、线程的创建,线程的主要方法,实现线程同步(例)
【背景】:
单道批处理机,通过磁带将程序顺序的装入计算机,直到程序执行完毕,再载入下一个程序。Monitor 监督程序,监控过程:cpu执行程序——I/O请求,cpu等待I/O结束,cpu继续执行程序
多道批处理机(IBM-OS/360),外存任务队列,算法选择,同时交替运行n个程序,使cpu总是处于忙碌状态。
过程:A cpu执行程序,I/O执行请求, cpu执行B程序,I/O请求(等待),cpu执行C程序、A释放I/O B执行I/O、C等待I/O cpu继续执行A程序 (两种资源cpu和I/O)
分析一下区别:资源独享,和资源共享,间断执行,异常率高,
【什么是进程】:
20世纪60年代,提出进程的概念,并在OS下实现多进程。进程:
process ,OS下独立拥有资源,调度,运行的基本单位。
进程的两个基本属性:
(1)拥有资源(程序正文,内存地址,数据磁盘信息 (2)拥有唯一PCB process control block 管理资源地址,保存调度和断点信息等… 【注】程序:一组有序的指令集合,进程才是执行的实体。
进程的5种基本状态:
【什么是线程】:
20世纪80年代,提出线程的概念Thread、又叫做light-weight-process取代了进程,成为调度和分派的基本单位。
线程本身并不拥有资源,除少量必须(tcb少量局部变量,状态参数和,地址信息)
线程出现的根本原因是进程 heavy-weight-process的创建、切换、撤销所花费的时、空开销太大、
创建:分配资源,内存空间,IO资源,唯一的PCB
撤销:回收资源,撤销PCB
切换:保留当前cpu进程环境,创建/回收新环境
【进程和线程的区别】:
资源:进程拥有资源,线程本身不拥有独立性:进程之间防止干扰破坏,空间资源独立,线程之间共享合作,
系统开销:进程开销大,线程小,同OS下30倍以上的创建效率,5倍以上的切换
【创建线程的两种方式】:
(1)继承Thread类,重写run方法Start()启动线程,执行run()中内容
//实现,线程start()同时载入,系统决定如何执行
(2)实现Runnable接口,实现run方法
Java只允许有一个“父亲”extends 但是可以有多个“师傅”implements
【线程的基本状态】
Sleep方法只是当前thread休眠,不会释放锁 ,wait会释放锁,notifyAll会唤醒全部wait线程,但并不是立即让出cpu
Interrupt取代了stop方法,会向线程发出中断信号
SetPriority可以设置线程优先级,1最低,5默认,10最高
【实现线程同步】:
实现简单的线程同步:在4个窗口下售出50张车票提示:创建售票窗口类(Ticket),继承Thread类,重写run方法,在run方法内模拟售票操作,注意使用同步锁,票的数量是用静态成员变量!
public class Ticket implements Runnable{ static Object obj = ""; private static int TICKET_NUM=50; @Override public void run() { // TODO Auto-generated method stub while(TICKET_NUM>=0) { synchronized (obj) { if(TICKET_NUM > 0) { System.out.println(Thread.currentThread()+"窗口还剩"+TICKET_NUM+"张"); TICKET_NUM--; }else { break; } try { Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); } } } } public static void main(String[] args) { for(int i=0;i<4;i++) { Ticket ticket = new Ticket(); Thread t = new Thread(ticket); t.start(); } } }