java中多线程的输出不正确

时间:2013-08-03 16:53:40

标签: java multithreading

为什么有时我得到输出:

患者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
    }
}

3 个答案:

答案 0 :(得分:2)

一旦你开始一个线程,它完全取决于VM何时该线程获得周期。无法保证它们按照start()ed。

的顺序运行

答案 1 :(得分:1)

当线程并行运行时,执行顺序通常是不确定的。因此,您的代码输出完全正常 - 您几乎同时启动所有线程,并且大多数时间它们并行运行。

答案 2 :(得分:0)

线程处理由vm完成而不是您的代码。这意味着您的系统决定允许线程运行的时间和持续时间,除非您命令线程等待,休眠或产生。还可以选择声明首选项。 这些开关不等待,直到线程达到分号,并且(大多数情况下)可以在字节码级别的操作之间发生。一般情况下,建议不要在代码中干扰线程处理,除非您绝对需要它来进行计时。 只要两个线程有​​可能访问并更改相同的资源,以便在opperation / method / ect中间切换线程,你仍然应该记住syncronisation。会破坏两个线程的结果。