java多线程笔记之让步yield例子

先看个yield让步的例子

 代码如下 复制代码

package com.javaer.thread;
 
public class YThread implements Runnable {
 private Object obj = new Object();
 
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  YThread s = new YThread();
  Thread t1 = new Thread(s, "Thread1");
  Thread t2 = new Thread(s, "Thread2");
  t1.start();
  t2.start();
 
 }
 
 @Override
 public void run() {
 
  for (int i = 0; i < 10; i++) {
   try {
    Thread.sleep(10);
   } catch (InterruptedException e) {
 
   }
   System.out.println(Thread.currentThread().getName() + " 在运行 " + i);
   if (Thread.currentThread().getName().equals("Thread1")) {
    Thread.yield();
   }
  }
 
 }
 
}
输出

Thread1 在运行 0
Thread2 在运行 0
Thread1 在运行 1
Thread2 在运行 1
Thread2 在运行 2
Thread1 在运行 2
Thread2 在运行 3
Thread1 在运行 3
Thread2 在运行 4
Thread1 在运行 4
Thread2 在运行 5
Thread1 在运行 5
Thread2 在运行 6
Thread1 在运行 6
Thread2 在运行 7
Thread1 在运行 7
Thread2 在运行 8
Thread1 在运行 8
Thread2 在运行 9
Thread1 在运行 9

我们发现尽管从第一次循环就开始让步了,不过系统在第二次循环才真正让出资源。另外,如果多次执行这个代码,发现有时候根本没有让出来。

结论

让步会主动让出系统资源给其他线程,但是不代表让步了,其他线程就能获得CPU资源。另外让步不影响自己线程继续执行。类似两个车子在路上开,给别人让路不代表我要停下。

看下让步与锁的相互作用

 代码如下 复制代码
package com.javaer.thread;
 
public class YThread implements Runnable{
 private  Object obj = new Object();
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  YThread s=  new YThread();
   Thread t1 = new Thread(s, "Thread1");
   Thread t2 = new Thread(s, "Thread2");
   t1.start();
   t2.start();
 
 }
 
 @Override
 public void run() {
 
  synchronized(obj){
   for(int i =0 ; i < 10;i++){
    try {
     Thread.sleep(10);
    } catch (InterruptedException e) {
 
    }
    System.out.println(Thread.currentThread().getName() + " 在运行 " + i);
    if(Thread.currentThread().getName().equals("Thread1")){
     Thread.yield();
    }
   }
  }
 }
 
}

我们知道,wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而yield()的作用是让步,它也会让当前线程离开“运行状态”。它们的区别是:
(01) wait()是让线程由“运行状态”进入到“等待(阻塞)状态”,而不yield()是让线程由“运行状态”进入到“就绪状态”。
(02) wait()是会线程释放它所持有对象的同步锁,而yield()方法不会释放锁。

上面的结果看出,程序整个被锁定,进行了顺序执行

Thread1 在运行 0
Thread1 在运行 1
Thread1 在运行 2
Thread1 在运行 3
Thread1 在运行 4
Thread1 在运行 5
Thread1 在运行 6
Thread1 在运行 7
Thread1 在运行 8
Thread1 在运行 9
Thread2 在运行 0
Thread2 在运行 1
Thread2 在运行 2
Thread2 在运行 3
Thread2 在运行 4
Thread2 在运行 5
Thread2 在运行 6
Thread2 在运行 7
Thread2 在运行 8
Thread2 在运行 9
总结
yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

1.仅仅是让步
2.不会释放锁

时间: 2024-11-02 15:38:52

java多线程笔记之让步yield例子的相关文章

详解Java中的线程让步yield()与线程休眠sleep()方法_java

线程让步: yield()yield()的作用是让步.它能让当前线程由"运行状态"进入到"就绪状态",从而让其它具有相同优先级的等待线程获取执行权:但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权:也有可能是当前线程又进入到"运行状态"继续运行!示例: class ThreadA extends Thread{ public ThreadA(String name){ super(name); } pu

Java多线程yield心得分享_java

一. Thread.yield( )方法: 使当前线程从执行状态(运行状态)变为可执行态(就绪状态).cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了. Java线程中有一个Thread.yield( )方法,很多人翻译成线程让步.顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行. 打个比方:现在有很多人在排队上厕所,好不容易轮到这个人上厕

java多线程问题,java 编程思想书中的例子

问题描述 java多线程问题,java 编程思想书中的例子 在看java编程思想书中的多线程一节,书中对wait,notify,notifyall举了一个例子,模拟给汽车涂蜡和抛光的过程, 因为抛光任务在涂蜡之前是不能尽兴的,反之,涂蜡任务在涂另外一层蜡之前,必须要等抛光任务结束.代码如下: 显示一个汽车类: class Car{ private boolean wanOn=false; public synchronized void waxed(){ waxOn=true; notifyAl

Java多线程中的wait与notify,notifyall例子

在Java多线程编程中,wait()的作用的是让当前线程进入阻塞状态,notify()是让当前线程唤醒继续执行.虽然是对线程状态的控制,但它们其实都是Object中的方法,这是因为wait与notify所起的作用与线程间的互斥锁有关. 在执行wait()和notify()之前,必须要先获得互斥锁,即一定要和synchronized一起使用.wait()的含义是让出获得的互斥锁,并让自己进入阻塞状态.在notify()的时候也已经获得了互斥锁,所做的事情就是唤醒当前线程继续执行. 假如synchr

Java多线程学习(吐血超详细总结)

  本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等.在这之前,首先让我们来了解下在操作系统中进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止. 多

Java 多线程学习详细总结_java

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递      本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个

整理总结Java多线程程序编写的要点_java

线程状态图 线程共包括以下5种状态. 1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable): 也被称为"可执行状态".线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行. 3. 运行状态(Running) : 线程获取CPU权限进行执行.需要注意的是,

超详细的Java多线程教程

<一>概述.定义任务 一.概述 为什么使用线程?从c开始,任何一门高级语言的默认执行顺序是"按照编写的代码的顺序执行",日常开发过程中写的业务逻辑,但凡不涉及并发的,都是让一个任务顺序执行以确保得到想要的结果.但是,当你的任务需要处理的业务比较多时,且这些业务前后之间没有依赖(比如, a执行的过程中b也可以执行,b没有必要必须等待a执行完毕再去执行),那么此时,我们可以将一个任务拆分成多个小任务. 例如,任务a负责接收键盘的输入,b负责将一些参数及计算提前做好(假设计算量比

Java多线程编程详解

编程|多线程|详解 一:理解多线程多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单.多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的"同时"是不可