Java:线程问题

时间:2015-11-09 10:21:33

标签: java multithreading

我正在努力改进我的JAVA。现在我有一个我不了解线程的问题。

我正在尝试的代码是,

public class MyThread implements Runnable {
    private int    end;
    private String name;

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

    @Override
    public void run() {
        for (int i = 0; i < end; i++) {
            System.out.println(name + " : " + i);
        }
    }
}

public class ThreadLesson {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyThread("thread1", 6));
        Thread thread2 = new Thread(new MyThread("thread2", 5), "thread2");
        thread1.start();
        thread2.start();
    }
}

课程输出

thread1 : 0
thread2 : 0
thread2 : 1
thread2 : 2
thread1 : 1
thread2 : 3
thread1 : 2
thread2 : 4 
thread1 : 3
thread1 : 4
thread1 : 5

我的外出是

Thread1:0
Thread2:0
Thread1:1
Thread1:2
Thread1:3
Thread1:4
Thread1:5
Thread2:1
Thread2:2
Thread2:3
Thread2:4

我的问题是, 为什么我的课程输出不一样?有一些问题,或者谁写了这一课只是编辑文章的输出是好的。

3 个答案:

答案 0 :(得分:5)

本课程的某处可能是用粗体字母写的。 您不应期望与此处显示的结果相同。你通过传递2个不同的runnables开始了2个线程。没有正确的同步,就无法确定输出是什么。

答案 1 :(得分:1)

是的,您可能会发现在开始时非常奇怪,所获得的值差异很大。实际上,当允许两个或多个非同步线程同时运行时,无法确定正确的输出。

这可以理解为

当创建线程时,它们被认为是生成状态,你不使用run()运行线程但是你使用start()。现在你可能会问到背后的原因逻辑。

这很简单,如果你使用run()那么处理器必须在那一刻运行线程,这可能会导致问题。但是,如果您使用start(),那么您告诉处理器您要运行该线程。此后,处理器将在可以自由处理线程后立即处理该线程。 必须清楚的是,现代处理器同时执行许多任务。为此,他们可以使用Round-Robin方法或Preemptive调度来完成任务。 在时间分片中,每个进程都给予相同数量的处理器时间。而在抢先式调度中,具有较高优先级的任务被赋予偏好。

现在,当多个线程同时运行时,它依赖于操作系统将处理器分配给任何线程。所以任何线程都可以获得可以改变你看到的输出的处理器。

现在,如果线程已同步,则条件会发生变化,程序可以有固定的路径。

答案 2 :(得分:-2)

在这种情况下,我们无法预测输出模式,因为输出将完全取决于 jvm的线程管理器。如果你想有一个预测输出你可以去Thread.sleep(timeinml)方法,因为这将提供线程同步