博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
I学霸官方免费教程四十一 :Java基础教程之线程死锁
阅读量:5143 次
发布时间:2019-06-13

本文共 2992 字,大约阅读时间需要 9 分钟。

线程死锁

是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁线程。

例如:某一商店有两个人PS和PB在做交易,PS手里拿着货物对PB说,你先给我钱我在给你货,而PB拿着钱对PS说你先给我货我在给你钱。两个人就此僵持下去,永远也无法做成交易,这就构成了死锁。

实例:package thread.deadlock;/** * 创建DeadlockDemo类:用于测试死锁 * @author 学霸联盟 - 赵灿 */public class DeadlockDemo {	public static void main(String[] args) {		//创建一个Shop对象		Shop shop = new Shop();		//创建两个线程对象		ThreadBuy tBuy = new ThreadBuy(shop);		ThreadSell tSell = new ThreadSell(shop);		tBuy.start();		tSell.start();	}}/** * 创建Cargo(货物)类:仅仅为了创建对象,获取对象锁 * @author 学霸联盟 - 赵灿 */class Cargo{ }/** * 创建Money(货物)类:仅仅为了创建对象,获取对象锁 * @author 学霸联盟 - 赵灿 */class Money{ }/** * 创建Shop(商店)类 * @author 学霸联盟 - 赵灿 */class Shop {	//创建Cargo对象	private Cargo cargo = new Cargo();	//创建Money对象	private Money money = new Money();	//buyer方法完成买家想要的功能	public void buyer() {		//买家手里拿着钱,对应到代码上就是获得money对象的锁		synchronized (money) {			System.out.println("买家拿着钱说:先交货");			try {				//模拟等待卖家交货的时间				Thread.sleep(500);			} catch (InterruptedException e) {				e.printStackTrace();			}			//买家拿着钱的同时想要把货也拿到手里,再交出钱			synchronized (cargo) {				System.out.println("买家:成交");			}		}	}	//seller方法完成卖家想要的功能	public void seller() {		//卖家手里拿着货,对应到代码上就是获得cargo对象的锁		synchronized (cargo) {			System.out.println("卖家拿着货说:先交钱");			try {				//模拟等待买家交钱的时间				Thread.sleep(1000);			} catch (InterruptedException e) {				e.printStackTrace();			}			//卖家拿着货的同时想要把钱也拿到手里,再交出货			synchronized (money) {				System.out.println("买家:成交");			}		}	}}/** * 创建ThreadBuy类 * @author 学霸联盟 - 赵灿 */class ThreadBuy extends Thread{	private Shop  shop;	public ThreadBuy(Shop shop){		this.shop = shop;	}	@Override	public void run() {		//购买的线程,执行购买的方法		shop.buyer();	}}/** * 创建ThreadSell类 * @author 学霸联盟 - 赵灿 */class ThreadSell extends Thread{	private Shop  shop;	public ThreadSell(Shop shop){		this.shop = shop;	}	@Override	public void run() {		//卖出的线程,执行卖出的方法		shop.seller();	}}运行结果:卖家拿着货说:先交钱买家拿着钱说:先交货

死锁导致交易永远无法达成

线程优先级

线程优先级的本意是用于标识线程获得CPU的几率的高低,但线程调度不是绝对按照优先级的顺序调度的,这与操作系统和JVM有关。

java中对线程的优先级定义了10个级别,范围:1(Thread.MIN_PRIORITY )~ 10 (Thread.MAX_PRIORITY )),但不同的系统有不同的线程优先级的取值范围,这样就有可能多个线程优先级对应某种操作系统里有的同一优先级,所以很多时候设置优先级看不到不同优先级之间的差别。
自定义线程的优先级默认是父线程类的优先级
Thread类的默认优先级是5(Thread.NORM_PRIORITY)
设置线程优先级使用setPriority(int)方法

实例:package thread.priority;/** * 创建父线程 * @author 学霸联盟 - 赵灿 */public class FatherThread extends Thread {	// 声明一个无参数的构造方法	public FatherThread() {		// 设置当前类对象的优先级为8		this.setPriority(8);	}}package thread.priority;/** * 创建子线程 * @author 学霸联盟 - 赵灿 */public class SonThread extends FatherThread {	public static void main(String[] args) {		// 创建SonThread对象,并使用创建的对象调用start方法启动线程		new SonThread().start();	}	@Override	public void run() {		/*		 * 使用关键字this调用getPriority方法,获取当前线程的优先级		 * 并通过输出语句System.out.println将获取到的优先级输出		 */ 		System.out.println("子线程的优先级:" + this.getPriority());	}}运行结果:子线程的优先级:8

 

后台线程

在系统的后台运行,不与用户直接交互;这样的线程称为后台线程(也称服务线程或守护线程)。

例如:文件下载
setDaemon();//将线程设置为后台线程

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

转载于:https://www.cnblogs.com/ixueba/p/4734399.html

你可能感兴趣的文章
SCII码表 键盘常用ASCII码
查看>>
Asp.Net Core 自定义设置Http缓存处理
查看>>
深入浅出SharePoint—使用回收站
查看>>
li设置多选和取消选择的样式、输入数据类型判断
查看>>
这几天头很大呀,因为在做毕设实物。。。
查看>>
POJ3889 Fractal Streets 递归
查看>>
第八章 数组
查看>>
python 连加
查看>>
ros python 四元数 转 欧拉角
查看>>
使用dSYM分析App崩溃日志
查看>>
linux下C++ STL hash_map的使用以及使用char *型变量作为Key值的一大“坑”
查看>>
TCP/IP协议(1):各层协议帧格式
查看>>
Processor Speculative & pipeline
查看>>
ios英语口语800句应用源码
查看>>
边缘检测程序(matlab)
查看>>
锐捷交换机如何配置远程管理地址(telnet)
查看>>
Linux:保证数据安全落盘
查看>>
[HNOI2012]永无乡
查看>>
hdu 1421(搬寝室)
查看>>
微信小程序开发1
查看>>