-1

時々出力が得られるのはなぜですか:

患者 4 が診察室を訪れます。

患者 2 が診察室を訪れます。

患者 1 が診療所を訪れます。

出力が昇順、つまり患者 1、次に患者 2 または 3、次に患者 4 または 5 であると予想している場合。つまり、最初の for ループ以降、0 になる前に print 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
    }
}
4

3 に答える 3

0

スレッド処理は、コードではなく vm によって行われます。つまり、スレッドに待機、スリープ、または譲歩を命じない限り、システムがスレッドの実行を許可する時期と期間を決定します。プリファレンスを宣言するオプションもあります。これらの切り替えは、スレッドがセミコロンに到達するまで待機せず、バイトコード レベルの操作間で (ほとんどの場合) 発生します。一般に、タイミングのために絶対に必要な場合を除き、コード内からスレッド処理に干渉しないことはお勧めできません。それでも、操作/メソッド/ect の途中でスレッドを切り替えるために、2 つのスレッドが同じリソースにアクセスして変更する可能性がある場合は常に、同期を覚えておく必要があります。両方のスレッドの結果が台無しになります。

于 2013-08-03T17:06:57.707 に答える