我正在努力改进我的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
我的问题是, 为什么我的课程输出不一样?有一些问题,或者谁写了这一课只是编辑文章的输出是好的。
答案 0 :(得分:5)
本课程的某处可能是用粗体字母写的。 您不应期望与此处显示的结果相同。你通过传递2个不同的runnables开始了2个线程。没有正确的同步,就无法确定输出是什么。
答案 1 :(得分:1)
是的,您可能会发现在开始时非常奇怪,所获得的值差异很大。实际上,当允许两个或多个非同步线程同时运行时,无法确定正确的输出。
这可以理解为
当创建线程时,它们被认为是生成状态,你不使用run()运行线程但是你使用start()。现在你可能会问到背后的原因逻辑。
这很简单,如果你使用run()那么处理器必须在那一刻运行线程,这可能会导致问题。但是,如果您使用start(),那么您告诉处理器您要运行该线程。此后,处理器将在可以自由处理线程后立即处理该线程。 必须清楚的是,现代处理器同时执行许多任务。为此,他们可以使用Round-Robin方法或Preemptive调度来完成任务。 在时间分片中,每个进程都给予相同数量的处理器时间。而在抢先式调度中,具有较高优先级的任务被赋予偏好。
现在,当多个线程同时运行时,它依赖于操作系统将处理器分配给任何线程。所以任何线程都可以获得可以改变你看到的输出的处理器。
现在,如果线程已同步,则条件会发生变化,程序可以有固定的路径。
答案 2 :(得分:-2)
在这种情况下,我们无法预测输出模式,因为输出将完全取决于 jvm的线程管理器。如果你想有一个预测输出你可以去Thread.sleep(timeinml)方法,因为这将提供线程同步