目录
背景:
代码解释:
1.类定义
2.主方法(main)
3.自定义线程类(MyThread3)
总结:
背景:
在Java中,多线程是构建并发应用程序的关键技术。当我们多个线程需要同时执行时,操作系统必须决定何时为每个线程分配 CPU时。这个过程被称为线程调度,而Java提供一个yield()方法,它允许一个线程主动放弃当前占用的CPU资源,使得其他线程有机会获得执行。
代码解释:
1.类定义
public class TestYield { ... }  
class MyThread3 extends Thread { ... }·TestYield类是主类,包含main方法,作为程序的入口点。
·MyThread3类是自定义的线程类,它继承了Java的Thread类
2.主方法(main)
public static void main(String[] args) {      MyThread3 t1 = new MyThread3("t1");      MyThread3 t2 = new MyThread3("t2");      t1.start();      t2.start();      
}·在main方法中,我们创建了两个MyThread3类型的线程对象t1和t2
·使用new关键字和构造器为它们分配内存,并传入字符串参数作为线程的名称
·调用start()方法启动线程 。注意,不是直接调用run()方法,因为start()会由JVM来调用run(),同时启动一个新的线程来执行run()方法
3.自定义线程类(MyThread3)
class MyThread3 extends Thread {      MyThread3(String s) {      super(s);      }      public void run() {      for (int i = 1; i <= 100; i++) {      System.out.println(getName() + ": " + i);      if (i % 10 == 0) {     Thread.yield();      }      }      }      
}·MyThread3类继承了Thread类,因此它拥有Thread类的所有属性和方法
·构造器MyThread3(String s)接收一个字符串参数,并通过suprer(s)调用父类Thread的构造器来设置线程的名称
·run()方法是线程的主要逻辑,在这个例子中,我们有一个循环,从1迭代到100,在每次迭代中,我们打印出当前线程额名称和当前的迭代次数
·当迭代次数i是10的倍数时,我们调用Thread.yield()方法。这是告诉JVM,当前线程原因放弃CPU资源,以便其他线程可以得到执行的机会,但请注意,yield()只是一个建议,JVM可以选择忽略它
总结:
Java yield() 方法的表格总结:
| 属性/特点 | 描述 | 
|---|---|
| 方法名 | yield() | 
| 所属类 | java.lang.Thread | 
| 访问修饰符 | static | 
| 参数 | 无 | 
| 返回值 | void(无返回值) | 
| 作用 | 暂停当前正在执行的线程,以允许其他具有相同优先级的线程执行 | 
| 线程状态变化 | 从运行状态(Running)转为就绪状态(Ready) | 
| 释放锁 | 否(不会释放锁) | 
| 阻塞线程 | 否(不会阻塞线程) | 
| 调度器响应 | 向线程调度器提出建议,但调度器不一定会立即响应 | 
| 线程优先级 | 仅影响同优先级或更高优先级的线程 | 
| 示例用途 | 在循环中或当线程不需要立即执行时使用,以改善线程调度 | 
| 注意事项 | yield()不保证当前线程会立即停止执行,也不保证其他线程会立即开始执行 | 
虽然yield()并不能保证特定的线程执行顺序,但在多线程编程中,理解和正确使用yield()方法可以帮助我们更好地管理线程的执行,提升程序的并发性和响应性。然而,需要注意的是,过度使用yield()方法可能会导致线程切换过于频繁,进而引发性能问题。因此,在编写多线程程序时,我们应当根据具体的需求和场景,谨慎选择同步和协作机制,以达到最佳的并发性能和响应性。