这是Java并发编程原理,我们可以来了解一下,Java线程为什么会产生线程饥饿的问题,主要原因有下面三个:
  • 高优先级吞噬所有低优先级的CPU时间片
  • 线程被永久堵塞在一个等待进入同步块的状态
  • 等待的线程永远不被唤醒

如何尽量避免线程饥饿问题

线程的饥饿问题我们是没有办法永远解决的,只能尽量去避免线程的饥饿问题,主要有下面两个方法:

  • 设置合理的优先级
  • 使用锁来代替synchronized

设置合理的线程优先级

设置合理的线程优先级可以尽量避免重要的线程没有办法执行,我们看一下下面这个例子:

线程类:


package com.breakyizhan.thread.t4;

public class Target implements Runnable {

	@Override
	public void run() {

		while(true) {
			System.out.println(Thread.currentThread().getName() + " ...");

		}
		
	}

}

main类

package com.breakyizhan.thread.t4;

public class Demo {
	
	public static void main(String[] args) {
		
		
		Thread t1 =  new Thread(new Target());
		Thread t2 =  new Thread(new Target());
		
		//一般的话,不用1或者10,而是使用Thread类中的常量Thread.MIN_PRIORITY
		t1.setPriority(1);
		t2.setPriority(Thread.MIN_PRIORITY);
		
		t1.start();
		t2.start();
		
	}

}

从结果我们可以看到,大部分时间看到t2线程在执行,但是有小部分时间,t1线程也会抢占到CPU的资源

Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-1 ...
Thread-0 ...
Thread-0 ...
Thread-0 ...
.................

 
转载请保留页面地址:https://www.breakyizhan.com/java/6619.html
扫描二维码添加微信 
  • ,每次淘宝领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘50元优惠券!添加微信后回复机械键盘即可领取!
    支持我们,就用微信淘宝!