zoukankan      html  css  js  c++  java
  • java 多线程—— 线程让步

    java 多线程 目录:

    Java 多线程——基础知识

    Java 多线程 —— synchronized关键字

    java 多线程——一个定时调度的例子

    java 多线程——quartz 定时调度的例子

    java 多线程—— 线程等待与唤醒

    java 多线程—— 线程让步

    概述

    第1 部分 yield()介绍

    第2 部分 yield()示例

    第3 部分 yield() 与 wait()的比较

    第1 部分 yield()介绍

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

    第2 部分 yield() 示例

     1 package com.MultiThread;
     2 
     3 /**
     4  * 
     5  * @ClassName: ThreadB
     6  * TODO
     7  * @author Xingle
     8  * @date 2014-9-19 上午9:19:06
     9  */
    10 public class ThreadB extends Thread{
    11     public ThreadB(String name){
    12         super(name);
    13     }
    14     
    15     public synchronized void run(){
    16         for (int i=0;i<10;i++){
    17             System.out.printf("%s [%d]:%d
    ",this.getName(), this.getPriority(), i);
    18             //i整除4时,调用yield
    19             if (i%4 ==0)
    20                 Thread.yield();
    21         }
    22     }
    23 }
     1 package com.MultiThread;
     2 
     3 /**
     4  * 
     5  * @ClassName: YieldTest
     6  * TODO
     7  * @author Xingle
     8  * @date 2014-9-19 上午9:36:59
     9  */
    10 public class YieldTest {
    11     
    12     public static void main(String[] args){
    13         ThreadB t1 = new ThreadB("t1");
    14         ThreadB t2 = new ThreadB("t2");
    15         t1.start();
    16         t2.start();
    17     }
    18 
    19 }

    执行结果:

    结果说明
    “线程t1”在能被4整数的时候,并没有切换到“线程t2”。这表明,yield()虽然可以让线程由“运行状态”进入到“就绪状态”;但是,它不一定会让其它线程获取CPU执行权(即,其它线程进入到“运行状态”),即使这个“其它线程”与当前调用yield()的线程具有相同的优先级。

    第3 部分 yield() 与 wait()的比较

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

    下面通过示例演示yield()是不会释放锁的。

     1 package com.MultiThread;
     2 
     3 /**
     4  * 
     5  * @ClassName: YieldLockTest
     6  * TODO
     7  * @author Xingle
     8  * @date 2014-9-19 上午9:47:24
     9  */
    10 public class YieldLockTest {
    11     
    12     private static Object obj = new Object();
    13     
    14     public static void main(String[] args){
    15         Thread1 t1 = new Thread1("t1");
    16         Thread1 t2 = new Thread1("t2");
    17         t1.start();
    18         t2.start();
    19         
    20     }
    21     
    22     static class Thread1 extends Thread {
    23         
    24         public Thread1(String name){
    25             super(name);
    26         }
    27         
    28         public void run(){
    29             synchronized (obj) {
    30                 for (int i= 0;i<10;i++){
    31                     System.out.printf("%s [%d]:%d
    ",this.getName(), this.getPriority(), i);
    32                     if(i%4==0)
    33                         Thread.yield();
    34                 }
    35                 
    36             }
    37         }
    38         
    39     }
    40 
    41 }

    执行结果:

    结果说明
    主线程main中启动了两个线程t1和t2。t1和t2在run()会引用同一个对象的同步锁,即synchronized(obj)。在t1运行过程中,虽然它会调用Thread.yield();但是,t2是不会获取cpu执行权的。因为,t1并没有释放“obj所持有的同步锁”!

  • 相关阅读:
    How to alter department in PMS system
    Can't create new folder in windows7
    calculate fraction by oracle
    Long Wei information technology development Limited by Share Ltd interview summary.
    ORACLE BACKUP AND RECOVERY
    DESCRIBE:When you mouse click right-side is open an application and click left-side is attribution.
    ORACLE_TO_CHAR Function
    电脑BOIS设置
    JSP点击表头排序
    jsp+js实现可排序表格
  • 原文地址:https://www.cnblogs.com/xingele0917/p/3980798.html
Copyright © 2011-2022 走看看