首页 > 试题广场 >

public class Main{ &nb...

[单选题]
public class Main{

    public static ArrayList<String> list = new ArrayList<>();

    public static void main(String[] args) throws Exception{
        Thread t1 = new Main().new MyThread();
        Thread E10:E64t2 = new Thread(new Main().new MyRunnable());
        t1.setPriority(3);
        t2.setPriority(8);
        t1.start();
        t2.start();
        t2.join();

        for (int i = 0; i < 100000; i++) {
            i++;
        }
        list.add("main");
        
        t1.join();

        for (String s : list) {
            System.out.println(s);
        }
    }

    class MyThread extends Thread{
        @Override
        public void run(){
            for (int i = 0; i < 100000; i++) {
                i++;
            }
            list.add("Thread 1");
        }
    }

    class MyRunnable implements Runnable{
        @Override
        public void run(){
            for (int i = 0; i < 100000; i++) {
                Thread.yield();
                i++;
            }
            list.add("Thread 2");
        }
    }
}
  • Thread 1     Thread 2    main
  • Thread 2     Thread 1    main
  • Thread 2    main    Thread 1
  • 无法判断
这题的题目是啥...
发表于 2019-02-03 17:20:47 回复(0)
更多回答
yield()只是把当前线程从Running变成Runnable状态,仍然可以继续抢CPU,所以唯一能确定的只有Thread2->main。低优先级的线程在让出CPU后也不一定竞争不过高优先级的线程。
发表于 2019-03-04 19:42:40 回复(1)
哪位能解释一下为什么是 Thread 1     Thread 2    main 顺序?
发表于 2019-01-15 16:26:05 回复(0)
在main函数里面有 t2.join(); 说明,main函数所在线程肯定是晚于t2 ,可以确定Thread2->main 。然后根据t2里面有yield(),所以t2会让步给其它线程先执行,所以t1是先与t2,确定Thread1->Thread2,所以只有A了

                                                                                    
发表于 2019-02-24 17:09:16 回复(2)
Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,
让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。
        yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保
证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!
      举个例子:一帮朋友在排队上公交车,轮到Yield的时候,他突然说:我不想先上去了,咱们大家来竞赛上公交车。然后所有人就一块冲向公交车,
有可能是其他人先上车了,也有可能是Yield先上车了。
     但是线程是有优先级的,优先级越高的人,就一定能第一个上车吗?这是不一定的,优先级高的人仅仅只是第一个上车的概率大了一点而已,
最终第一个上车的,也有可能是优先级最低的人。并且所谓的优先级执行,是在大量执行次数中才能体现出来的。
发表于 2019-01-16 10:52:57 回复(1)
yield应该只能让出>=的吧,而且,这个还不保证一定切换线程
发表于 2020-08-04 21:06:49 回复(0)
yield不是只能让优先级>=它的线程执行吗?即使线程2把执行权让出来,也没有其他线程抢的过它
发表于 2019-10-07 23:33:37 回复(0)