yield()方法的使用

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

yield()方法的作用是放弃当前线程获取CPU的执行权,将让其它的线程去获取。但这个是不固定的,有可能刚放弃CPU的执行权,又被CPU执行了。下面我们测试一下不用调用yield()方法的线程它所消耗的执行时间。

/**
* 消息生产者
*
* @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() {
long time = System.currentTimeMillis();
for (int i = 1; i <= 1000000; i++) {
}
System.out.println(String.format("共用时:%s 毫秒 线程:%s", System.currentTimeMillis() - time, Thread.currentThread().getName()));
}
}
/**
* 消息消费者
*
* @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 thread = new Thread(messageServer);
thread.start();
}
}
共用时:5 毫秒 线程:Thread-0

我们看到它的执行速度很快。接下来我们测试一下调用yield()方法线程的执行时间是多少。

/**
* 消息生产者
*
* @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() {
long time = System.currentTimeMillis();
for (int i = 1; i <= 1000000; i++) {
Thread.yield();
}
System.out.println(String.format("共用时:%s 毫秒 线程:%s", System.currentTimeMillis() - time, Thread.currentThread().getName()));
}
}
/**
* 消息消费者
*
* @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 thread = new Thread(messageServer);
thread.start();
}
}
共用时:367 毫秒 线程:Thread-0

我们看到如果调用yield()方法那此线程所耗费的时间大大增加了,原因就如上面所说的,因为它放弃了CPU的执行权,虽然它放弃了但CPU还是会执行它的。所以在日常开发中,如果某一个线程是不太紧急的线程那我们可以在编写时调用yield()这样会让其它线程得到更多的执行机会。