2013-08-03 58 views
-1

为什么有时候我会得到输出:java中的多线程错误输出

患者4访问医生办公室。

患者2访问医生办公室。

患者1访问医生办公室。

当我期望输出的顺序是递增的,即病人1,然后是病人2或3,然后病人4或5.即我不明白如何才能看到打印4,主要类中的初始循环是设置患者编号的内容,并且我立即启动线程。

这是我的代码:

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

您的患者是否与其他患者或医生或调度员有过沟通?如果不是,他们可以让别人饿死。 –

+0

如果您想要顺序执行,那么使用单个线程。 –

回答

2

一旦你开始一个线程,它完全取决于VM何时该线程获取周期。不能保证它们按照开始()编辑的顺序运行。

+0

所以它不是顺序的?这怎么可能是这样? – Ozymandias

+0

@Ozymandias http://en.wikipedia.org/wiki/Parallel_computing –

+3

@Ozymandias您错过了创建线程的观点 – keyser

1

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

0

线程处理由vm完成,而不是您的代码。这意味着系统决定允许线程运行的时间和时间,除非您命令线程等待,休眠或退出。还可以选择声明首选项。 这些交换机不会等待直到线程达到分号,并且可以(主要是)在字节码级别上的操作之间发生。通常不建议不要干扰代码内的线程处理,除非您绝对需要它来进行计时。 无论何时有可能两个线程访问并更改相同的资源,以便在操作/方法/中间切换线程,仍然应该记住syncronisation。会搞砸两个线程的结果。