首页 > 试题广场 >

关于下面这段Java程序,哪些描述是正确的:( ) publ

[不定项选择题]
关于下面这段Java程序,哪些描述是正确的:( )
public class ThreadTest extends Thread {
    public void run() {
        System.out.println("In run");
        yield();
        System.out.println("Leaving run");
    }
    public static void main(String []argv) {
        (new ThreadTest()).start();
    }
}

  • 程序运行输出只有In run
  • 程序运行输出只有Leaving run
  • 程序运行输出先有In run后有Leaving run
  • 程序运行输出先有Leaving run后有In run
  • 程序没有任何输出就退出了
  • 程序将被挂起,只能强制退出
我来看看有多少人被不定项选择给迷惑了
发表于 2019-09-19 08:29:56 回复(32)
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。

yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中

结论:yield()从未导致线程转到等/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
发表于 2019-06-12 22:30:29 回复(14)
yield是线程礼让, 没有多个线程,不需要礼让
发表于 2019-11-14 15:14:25 回复(9)
本题中。有一个进程和两个线程。分别是主线程和TreadTest产生的线程。在主线程中。启动了Tread Test线程后,主线程就结束了。但程序并未退出。因为还有Tread Test线程。当执行了Tread Test的run()中的yield()。礼让资源后,进程中并未有其它线程。所以还是按顺序执行。
发表于 2021-12-08 21:10:34 回复(0)
yield()把正在运行的线程转为就绪态,放在就绪队列里面,如果争取到了CPU资源立马可以执行
发表于 2020-02-18 10:17:35 回复(1)
这题挺TM操蛋.
发表于 2021-11-24 02:53:13 回复(0)
C中的(windows,linux)main函数执行完,整个进程结束,其子线程也被强制结束退出。这个是C/C++与java很大的不同。C/C++,通常需要主线程主动等待子线程完成再退出。而java不需要在main函数中显式等待子线程(非Daemon线程)退出,而是自动创建DestroyJavaVM线程来管理。 JAVA虚拟机启动程序步骤: (1) Main是启动时候的主线程,即程序入口 (2) 在main函数结束后,虚拟机会自动启动一个DestroyJavaVM线程,该线程会等待所有user thread 线程结束后退出(即,只剩下daemon 线程和DestroyJavaVM线程自己,整个虚拟机就退出,此时daemon线程被终止),因此,如果不希望程序退出,只要创建一个非daemon的子线程,让线程不停的sleep即可。
发表于 2019-10-09 21:27:25 回复(1)
yield()是释放执行权,重新回到可执行状态,再等待CPU重新分配资源。
发表于 2019-12-13 13:04:18 回复(0)
我没被不定性迷惑,但是我选错了😒
发表于 2019-12-03 17:15:09 回复(0)

多线程差差差,不了解yield()方法

发表于 2019-10-05 02:45:15 回复(0)
就算其他线程拿到执行权了,它们执行完了,最终这个线程还是要执行的
发表于 2021-05-10 08:53:16 回复(1)
yield,遇到这个会立马回到就绪状态。让优先级高的先执行。 本题中,就算回到就绪,那也是run先执行。 注意,本题一共俩线程,如果主线程也有打印,这题就不好说,有可能是主线程先打印
编辑于 2020-10-29 08:17:55 回复(0)
<p>yield是线程礼让 ,没有多个线程的话,暂停后还是执行自己本身。</p>
发表于 2020-09-26 00:59:33 回复(0)
关于yield(),就不解释了,这里迷惑我的就是A选项了,不过之前做过一道关于进程结束的标准:所有前台进程结束。
这里的主线程和new thread()都是前台进程,所以要等到他俩全部结束,程序才会停止。所以只会有一个结果。
如果将new thread()创建的线程变为后台进程(守护进程)setDaemon(true),应该就会有三个结果(什么都没有;In run;In run \n Leaving run)了。
理想很丰满,运行了一下代码,Main总是运行的太快了,守护进程来不及输出久结束了,在main()最后也加了一句sout()
public static void main(String []argv) throws InterruptedException {
    Thread t1 = new ThreadTest();
    t1.setDaemon(true);
    t1.start();
    System.out.println("main---------");
}
不过结果就
main---------
main---------
In run
Leaving run
就分享这么多了。欢迎大家讨论讨论,我是个小白。。。fight!
发表于 2020-09-05 11:26:24 回复(0)
每次看到不定项选项就习惯性的多选😂🤣
发表于 2019-10-15 14:34:55 回复(0)
开始选得C很坚定,说多选,实在没法只得选AF
发表于 2022-11-30 15:12:58 回复(0)
Yield使礼让main线程
发表于 2022-04-03 22:05:42 回复(0)
Thread.yield()线程让步。使用了这个方法之后,线程会让出CPU执行权,让自己或者其它的线程运行。也就是说,当前线程调用yield()之后,并不能保证:其它具有相同优先级的线程一定能获得执行权,也有可能是当前线程又进入到“运行状态”继续运行。
发表于 2022-03-05 18:33:49 回复(1)
class MyThread extends Thread{
    @Override
    public void run(){
        System.out.println("I am run");
        // 线程让步 没有多线程程 不让步 但是 即使有多线程 因为线程的执行优先级是由cpu决定的
        // 可能yield让步也没作用
        yield();
        System.out.println("Leaving run");
    }
    public static void main(String[] args) {
        new Thread(new MyThread()).start();
    }
    /**
     * 结果
     * I am run
     * Leaving run
     */
}


发表于 2022-02-18 17:23:43 回复(0)
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。 yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。 结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
发表于 2020-02-22 00:29:47 回复(0)