• Tags
  •         
  • www.breakyizhan.com
  •    
    这是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