程序、进程和线程
1.程序Program:是一段静态的代码,它是应用程序执行的蓝本。
2.进程Process:是指一种正在运行的程序,有自己的地址空间
3.进程的特点:动态性、并发性、独立性
4,.并发和并行:
共同点:宏观上都是多个程序同时运行
不同点:微观上并发是一个一个执行
微观上并行还是同时执行
5.线程:进程内部的一个执行单元,它是程序中一个单一的顺序控制流程
线程又被称为轻量级进程
如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为多线程
6.线程特点:轻量级进程、独立调度的基本单位、可并发执行、共享进程资源
7.线程和进程的区别:
最主要区别:进程是作为资源分配的单位、线程是调度和执行的单位,线程组只能共享资源
线程类1
1.如何定义线程类
public class RabbitThread extends Thread{
public void run(){
//线程体 线程要做的事情 完成的功能
}
}
2. 如何创建线程对戏那个
Thread rt = new RabbitThread();
3.如何启动线程
//rt.run(); //不是启动线程,是调用方法
rt.start(); //启动线程,线程排队,轮到cpu执行时执行run(),时间片结束,让出 cpu,cpu会执行下一个线程
4.线程的方法
run() 线程体
start() 启动线程
Thread.cuttrenThread() 得到当前线程
getName() 获取线程name
setName("兔子线程")
5.之前的程序都是单线程,线程名称默认main
没创建一个线程,默认的名称 Thread-0 Thread-1 Thread-2
线程类2----定义线程的第二种方式
1.如何定义线程类
public class RabbitRunnable implements Runnable {
public void run(){
}
}
2.如何创建线程对象
Runnable rr = new RabbitRunnable();
Thread rt = new Thread(rr);
3.如何启动线程
rt.start();
4.两种定义线程方式的优缺点
方式1:extends Thread
代码简单
不能再继承其他类
方式2:implements Runnable
代码繁琐些
可以继承其他类
5.注意:一个线程只能启动一次(start())
线程类3
1.优先级的级别
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
级别高意味着获取的CPU的概率高,级别低也不意味着没有执行的机会
2.守护线程
使用情况较少,但并非无用,距离来说,JVM的垃圾回收、内存管理等线程都是守护线程。
还有就是在做数据库应用的时候,使用的数据库连接池。
连接池本身也包含着很多后台线程,监控丽娜姐个数、超过时间、状态等等。
守护线程通常用于执行一些后台作业,例如在你的应用程序运行时播放背景音乐,在文字编辑器里做自动语法检查、自动保存等功能。
Java的垃圾hi手也是一个守护线程,守护线程的好处就是你不需要关心它的结束问题。
例如在你的应用程序运行的时候希望播放背景音乐,如果将这个播放背景音乐的线程设定为非守护线程,那么在用户请求退出的时候,不仅要退出主线程,还要通知 播放背景音乐的线程退出;如果设定为守护线程就不需要了。
同步监视器
1.实现线程同步有两种方式
1.同步代码块synchronized(account){.....}
2.同步方法
3.新版本中增加Lock
2.同步监视器的作用和要求
synchronized(同步监视器){
}
作用相当于一把锁
要求
1.只能是引用数据类型,不能是基本数据类型
2.可以改变引用类型的值,但是不能改变引用类型的引用
3.最好不要使用String和Integer,如果使用,不要改变其值
4.一般使用共享资源做同步监视器即可
5.也可以创建一个没有任何意义的对象专门做锁
3.同步代码块的执行过程
1.第一个线程要进入同步代码块,先看同步监视器(锁)的状态,肯定是open,置为close状态,执行其汇总的代码
2.第二个线程要进入同步代码块,先看同步监视器(锁)的状态,如果是close,无法访问,进入阻塞状态
3.第一个线程知心代码块过程中进行了线程切换(sleep),让出了CPU,但是锁还是close
4.第一个线程再次获取CPU,执行代码完毕,将同步监视器置为open状态
5.第二个线程再次要进入同步代码块先看同步监视器(锁)的状态,如果是open,重复之前的步骤即可
强调1:同步代码块作用:其中的代码时一个整体,必须让一个线程从头到尾执行完毕,其他线程才有机会
强调2:同步代码块中可以出席爱你线程切换,但是保证其他线程无法进入该代码,知道代码被当前线程执行完毕。
生活案例:火车的卫生间 加锁
4.优缺点
优点:安全
缺点:性能下降
同步代码块是串行的,而不是并行的
可能导致死锁
死锁:
含义:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下 去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
四个必要条件:
互斥条件、请求和保持条件、不剥夺条件、环路等待条件。
四个条件必须同时触发,才会产生死锁。
5.其他
1.一个同步监视器close后,会锁定所有使用该同步监视器的代码块,其他线程不能进入任何一个使用该同步监视器的代码块。直到open为止。
2.一个同步监视器close后,会锁定所有使用该同步监视器的代码块,但是不会锁定使用其他同步监视器的代码块,其他线程可以访问,如果是open。