【Java多线程】——暂停线程与线程优先级

1、暂停线程

暂停线程意味着此线程还可以恢复运行,java中用suspend()暂停线程,用resume()恢复线程的运行。

suspend与resume有一个共同的缺点——独占。在使用这两个方法的时候,如果使用不当,极易造成对公共的同步对象的独占,使得其他线程无法访问公共的同步对象。比如一个线程调用了一个同步方法或者是操作了一个同步代码块指定的同步对象,而在同步方法调用完毕之前调用了suspend(),则其他线程不可再调用这个方法,这会导致程序运行效率降低。

suspend和resume还有另一个缺点——不同步。在使用这两个方法的时候也很容易出现因为线程暂停而导致的数据不同步的现象。也就是说在执行suspend方法的时候是不能保证线程安全的。比如一个线程正在修改一个对象内部的变量时,修改到一半突然执行suspend(),在第一个线程暂停的时间内,当另一个线程访问的时候就会发生数据不一致的问题。

2、yield()方法

yield()方法的作用是放弃当前的CPU资源,和sleep()相似的是,当线程持有同步对象的锁的时候,在线程休息期间不会释放锁资源。和sleep不同的是,yield方法只会将CPU资源让给比自己优先级更高的线程去执行,并且放弃时间不确定,有可能刚刚放弃,突然又获得CPU资源。而sleep方法则可以固定自己的放弃时间,并且不关心让出去的资源被何种优先级的线程所占用。yield方法会使当前的线程进入就绪状态,等待处理机的重新调度分配。

3、线程的优先级

在操作系统中线程可以划分优先级,优先级较高的线程占用CPU资源较多,也就是CPU优先执行具有较高优先级的线程中的任务。java中可以手动设置线程的优先级,设置线程的优先级有助于帮助“线程规划器”确定下一次选择哪一个线程来执行。

Java中线程的优先级分为从1-10,若果超出这个范围,则会抛出IllegalArgumentException()。JDK中使用三个常量来定义优先级的值:

public final static int MIN_PRIORITY = 1;

public final static int NORM_PRIORITY = 5;

public final static int MAX_PRIORITY = 10;

线程的优先级具有继承性,比如A线程启动B线程,则B线程具有和A线程一样的优先级。

线程的优先级具有规则性,如果A线程的优先级远大于B线程,即使B线程开始的代码调用顺序在A线程之前,CPU也会优先执行A线程的任务,不过这并不代表高优先级的线程的所有任务都会优先执行完,只是大部分任务会优先于低优先级的任务。例如当A执行IO操作时可能会将CPU让给B线程。

线程的优先级具有随机性,虽然说线程的优先级较高的话会优先执行run()中的内容,但是这个结果不能说的太肯定,因为线程的优先级还具有随机性。当线程的优先级差别不大的时候,高优先级的线程不一定每一次都先执行完。

猜你喜欢

转载自blog.csdn.net/u012198209/article/details/80198500