📌  相关文章
📜  教资会网络 | UGC NET CS 2016 年 7 月 – III |问题 41(1)

📅  最后修改于: 2023-12-03 14:54:49.892000             🧑  作者: Mango

教资会网络 | UGC NET CS 2016 年 7 月 – III |问题 41

本题目涉及Java程序开发中的多线程。

问题描述

在Java中,线程的状态分为五种:New、Runnable、Blocked、Waiting、Timed Waiting和Terminated。以下哪种方法不能让线程从Waiting状态到Runnable状态转换?

A. Object.notify()

B. Thread.interrupt()

C. Object.notifyAll()

D. Thread.yield()

答案解析

本题考查了Java多线程的相关状态和线程状态转换的知识点。

根据题干,我们知道需要排除不能让线程从Waiting状态到Runnable状态转换的方法。线程的状态转换需要依靠jdk提供的api,这里我们分别分析一下正确答案。

A. Object.notify()

该方法会唤醒一个因调用Object.wait()而处于等待状态的线程,该线程会由等待状态进入就绪状态,等待JVM调度执行。因此A选项不是本题的正确答案。

B. Thread.Interrupt()

该方法是一个线程中断的方法,如果当前线程不是Waiting状态,这个方法不会有任何的效果,因此B选项也不是答案。

C. Object.notifyAll()

该方法会唤醒所有的因调用Object.wait()而处于等待状态的线程,这些线程都会由等待状态进入就绪状态,等待JVM调度执行。因此C选项也不是本题的答案。

D. Thread.yield()

该方法是一个线程让出CPU的方法,使当前线程从运行状态进入就绪状态,等待JVM调度执行。因此D是本题正确答案。

因此本题答案为选项D。

代码示例
public class YieldExample {
    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();
    }
}

class MyRunnable implements Runnable {
    public void run() {
        for(int i=0; i<10; i++) {
            System.out.println(Thread.currentThread().getName()+"运行 "+i);
            if(i==5) {
                Thread.yield();
            }
        }
    }
}

这是一个简单的Java多线程程序,如果执行到i=5时,当前线程会调用Thread.yield()方法将CPU让出,进入就绪状态等待JVM调度执行。