为什么有时我得到输出:
患者4访问医生办公室。
患者2访问医生办公室。
患者1访问医生办公室。
当我期望输出按递增顺序,即患者1,然后患者2或3,然后患者4或5.即,我从无法理解它是如何看到打印4在它从最初到0之前主类中的for循环用于设置患者编号,我立即启动该线程。
这是我的代码:
public static void main(String[] args)
{
NUM_P = 5;//TEMPORARILY HARD CODE, WILL TAKE ARG FROM COMMANDLINE IN THE FUTURE
NUM_A = 2;
Patient[] myPatients = new Patient[NUM_P];
for (int i = 0; i < NUM_P; i++)
{
Patient patient = new Patient();
patient.setPatientNumber(i);
myPatients[i] = patient;
myPatients[i].start();
}
}
在患者班中,
public void run()
{
attendParty();
visitDoctor();
}
public void visitDoctor()
{
System.out.println("Patient-"+(this.getPatientNumber())+" visits doctor office.");
}
public void attendParty() throws InterruptedException
{
Random randomGen = new Random();
int val = randomGen.nextInt(101);
if (val < 20)
{
interrupt();
//NO NEED TO CREATE A PATIENT THREAD, THE PATIENT IS NOT SICK HEHE
}
else
{
this.setSickness(true);//He is sick
}
}
答案 0 :(得分:2)
一旦你开始一个线程,它完全取决于VM何时该线程获得周期。无法保证它们按照start()ed。
的顺序运行答案 1 :(得分:1)
当线程并行运行时,执行顺序通常是不确定的。因此,您的代码输出完全正常 - 您几乎同时启动所有线程,并且大多数时间它们并行运行。
答案 2 :(得分:0)
线程处理由vm完成而不是您的代码。这意味着您的系统决定允许线程运行的时间和持续时间,除非您命令线程等待,休眠或产生。还可以选择声明首选项。 这些开关不等待,直到线程达到分号,并且(大多数情况下)可以在字节码级别的操作之间发生。一般情况下,建议不要在代码中干扰线程处理,除非您绝对需要它来进行计时。 只要两个线程有可能访问并更改相同的资源,以便在opperation / method / ect中间切换线程,你仍然应该记住syncronisation。会破坏两个线程的结果。