setPriority()方法的使用

/ 多线程 / 没有评论 / 333浏览

在日常开发中我们常常遇到的情况就是希望某一个线程可以优先执行因为这个线程可能比较重要。在Java中用setPriority()方法来设计线程的优先级。它的取值范围为1-10。数量越大优先级越高。虽然setPriority()方法是设置优先级的。但CPU并不保证优先级高的一定比优先级低先执行。我们看一下在没有设计优先级情况下两个线程的执行情况。

/**
* 消息生产者
*
* @author Sama
* @author admin@jilinwula.com
* @date 2017-03-13 16:31
* @since 1.0.0
*/
public class MessageServer implements Runnable {

@Override
public void run() {
for (int i = 1; i <= 20; i++) {
System.out.println(Thread.currentThread().getName());
}
}
}
Thread-0
Thread-0
Thread-0
Thread-0
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-1
Thread-1
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0

我们看到在没有设置先级时两个线程是交替输出,也就是说CPU在执行这两个线程时是均匀执行了并没做过多的处理。下面我们看一下当设置线程的优先级时结果是什么样的。

服务端的代码不用修改我们只改客户端的代码。

/**
* 消息消费者
*
* @author Sama
* @author admin@jilinwula.com
* @date 2017-03-13 16:41
* @since 1.0.0
*/
public class MessageClient {
public static void main(String[] args) throws InterruptedException {
MessageServer messageServer = new MessageServer();
Thread thread1 = new Thread(messageServer);
Thread thread2 = new Thread(messageServer);
thread1.setPriority(10);
thread2.setPriority(1);
thread1.start();
thread2.start();
}
}
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
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-1
Thread-1

我们看输出信息得知貌似是线程一先执行完的,然后在执行线程二的。但这只是一个理想的结果。实际上设置线程的优先级只是高优先级的线程比低优先级的线程获取CPU执行资格的概率高。虽然概率高但不并保证一定能够获取到。这里还有一个需要注意的就是线程默认的优先级是5。千万不要以为设置优先级的线程一定比没有设置优先级的线程获取CPU执行权的概率大。