0

我正在练习线程,我使用了 yield(),我期望输出如下:(但没有达到预期的效果)

One1
Two1
One2
Two2
One3
Two3
.
.
.
.

我下面的代码有什么问题?

public class Main2 {

    public static void main(String[] args) {

        MyThread myThread1 = new MyThread("One");
        MyThread myThread2 = new MyThread("Two");

        /*Thread t1 = new Thread(myThread1);
        Thread t2 = new Thread(myThread2);

        t1.start();
        t2.start();*/


        myThread1.start();
        myThread2.start();
    }
}


class MyThread extends Thread {

    private String name; 

    public MyThread(String name) {
        this.name = name;
    }

    public void run(){

        for(int i=1;i<=20;i++) {
            System.out.println(name+i);
            yield();
        }
    }
}

而且我想知道评论语句是否正确使用?我的意思是下面:

Thread t1 = new Thread(myThread1);
Thread t2 = new Thread(myThread2);

t1.start();
t2.start();

等待你的回复。。

4

3 回答 3

1

yield()方法在其 javadoc 中明确指出它是

向调度程序提示当前线程愿意放弃其当前对处理器的使用。调度程序可以随意忽略此提示。

因此,您不能总是期望执行传递给另一个线程。没有任何保证。

此外,在您的问题中,注释语句是否正确使用,不,它不会改变任何东西。Thread构造函数接受一个Runnable参数,最终将在该参数上执行该方法run()。该类因此是一个有效Threadimplements Runnable参数,但它与您启动它本身具有相同的效果Thread

于 2013-09-02T04:49:59.043 回答
0

如果你extend thread,你就按照你的方式去做。如果你implements Runnable,你做评论的方式。无论哪种方式都很好。

请注意,这yield实际上只是一个建议,因此您的输出顺序尚未确定。如果您希望它始终以某种方式存在,则需要使用锁或其他技术。

于 2013-09-02T04:51:45.187 回答
0

Thread#yield指出

使当前正在执行的线程对象暂时暂停并允许其他线程执行。

所以你不会在这里得到预期的输出。如果您想要预期的输出使用wait()notify()正确同步的方法。
I would like to know does commented statements correct to use or not?
是的,这是 100% 有效的 java 语法。

于 2013-09-02T04:52:44.287 回答