从原理上讲其实Thread.yeild方法其实只是给线程调度机制一个暗示:我的任务处理的差不多了,可以让给相同优先级的线程CPU资源了;不过确实只是一个暗示,没有任何机制保证它的建议将被采纳;

看一个例子就知道了;

public class LiftOff implements Runnable {

    protected int countDown = 5;

    private static int taskCount = 0;
private final int id = taskCount++; public LiftOff() { } public LiftOff(int countDown) {
this.countDown = countDown;
} public String status() {
// System.out.println(Thread.currentThread().getName());
return Thread.currentThread().getName() + "#" + id + "(" + (countDown > 0 ? countDown + ")" : "Liftoff!" + ")");
} @Override
public void run() {
// TODO Auto-generated method stub
/*
* --countDown:先减去,再赋值
* countDown--先赋值,再减去
*/
while (countDown-- > 0) {
System.out.println(status());
Thread.yield();// 让步【表示我的任务处理的差不多了,可以让步给其他线程资源了】;CPU资源给其他线程使用;t.join当前线程挂起,直到t线程调用结束后切回
/*
* try {
* TimeUnit.MILLISECONDS.sleep(100);
* } catch (InterruptedException e) {
* // TODO Auto-generated catch block
* // e.printStackTrace();
* System.err.println("异常终止...");
* }
*/ } }
public class ExecuteMethodPool {

    public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();// 无界队列:将为每个任务创建一个线程
// ExecutorService executorService = Executors.newFixedThreadPool(2);// 有限线程数队列
// ExecutorService executorService = Executors.newSingleThreadExecutor();// 有限线程数队列 for (int i = 0; i < 3; i++) { executorService.execute(new LiftOff());
}
executorService.shutdown(); } }

响应结果打印:

p.p1 { margin: 0; font: 12px Menlo }

pool-1-thread-2#1(4)

pool-1-thread-1#0(4)

pool-1-thread-3#2(4)

pool-1-thread-2#1(3)

pool-1-thread-3#2(3)

pool-1-thread-3#2(2)

pool-1-thread-1#0(3)

pool-1-thread-2#1(2)

pool-1-thread-3#2(1)

pool-1-thread-1#0(2)

pool-1-thread-2#1(1)

pool-1-thread-3#2(Liftoff!)

pool-1-thread-1#0(1)

pool-1-thread-2#1(Liftoff!)

pool-1-thread-1#0(Liftoff!)

以上标注的两个一样的线程先后执行 并没有遵守yeild给线程调度的建议

Thread.yeild方法详解的更多相关文章

  1. JAVA THREAD.JOIN方法详解

    一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join() ...

  2. BigDecimal 使用方法详解

    BigDecimal 使用方法详解 博客分类: java基础 bigdecimalmultiplyadddivide  BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (sca ...

  3. Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  4. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  5. Java AtomicInteger类的使用方法详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Samp ...

  6. java多线程并发(二)--线程的生命周期及方法详解

    上篇随笔介绍了线程的相关基础知识以及新启线程的几种方法,本片将继续介绍线程的生命周期及方法详解. 一.线程的生命周期 在Thread代码中,线程的状态被分为6种 public enum State { ...

  7. 并发编程(六)Object类中线程相关的方法详解

    一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详 ...

  8. C#多线程详解(一) Thread.Join()的详解

    bicabo   C#多线程详解(一) Thread.Join()的详解 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程 ...

  9. AsList()方法详解

    AsList()方法详解 在Java中,我们应该如何将一个数组array转换为一个List列表并赋初始值?首先想到的肯定是利用List自带的add()方法,先new一个List对象,再使用add()方 ...

随机推荐

  1. 通过sql 语句将多行数据拼接到一行中

  2. 第3.11节 Python强大的字符串格式化新功能:format字符串格式化的格式控制

                                                第3.11节 format字符串格式化的格式控制 一.    引言 上节介绍了四种format进行字符串格式化的 ...

  3. Python链式赋值执行顺序及执行方式的证明

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<关于Python链式赋值的赋值顺序问题& ...

  4. flask中的重定向,渲染,反转视图函数

    在学习flask中,重定向,渲染,反转老是不怎么明白,今天明白了其中的点了,来给大家分享下 rend_templete()这个函数就是一个渲染的作用,渲染html的东西. url_for是反转视图函数 ...

  5. MyBatis if 标签的坑,居然被我踩到了。。。

    事件的原因是这样的,需求是按条件查数据然后给前端展示就行了,写的时候想着挺简单的,不就是使用 MyBatis 动态 SQL 去查询数据吗? 现实还是很残酷的,等我写完上完 UAT 后,前端同学说根据s ...

  6. uniapp图片转base64

    直接上代码了,网上也很多一样的,这里记录下,因为仅仅第二种在真机微信小程序上我这里测试转换失败,所以就一并写在这里了: //图片转base64 urlTobase64(url){ // #ifdef ...

  7. STL——容器(Set & multiset)的大小

    1. set.size();  //返回容器中元素的数目 2. set.empty();//判断容器是否为空 empty() 是由一下代码实现的,可以发现,当长度为0时返回 false,以此判断容器为 ...

  8. NSMutableArray 的实现原理

    一.普通C语言的数组实现: 是开辟一段连续的内存空间,缺点:在插入下标为0的元素,会移动其他所有元素.添加,插入,删除同理.           当数组非常大时,这样很快会成为问题.     二.OC ...

  9. HTTP/2做错了什么?刚刚辉煌2年就要被弃用了!?

    GitHub 19k Star 的Java工程师成神之路,不来了解一下吗! GitHub 19k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 19k Star 的Java工 ...

  10. IOS中使用.xib文件封装一个自定义View

    1.新建一个继承UIView的自定义view,假设类名叫做 MyAppVew #import <UIKit/UIKit.h> @class MyApp; @interface MyAppV ...