目录
背景:
在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()方法可能会导致线程切换过于频繁,进而引发性能问题。因此,在编写多线程程序时,我们应当根据具体的需求和场景,谨慎选择同步和协作机制,以达到最佳的并发性能和响应性。