0

Player1 と player2 という名前の 2 つのスレッド クラスがあります。

両方のプレーヤーが完了したら、両方のプレーヤーのスコアを要約する必要があります。

何よりも、すべての作業を完了しましたが、すべてのプレーヤーが完了するまでメイン スレッド (プレーヤーの概要を出力するため) を待機させることができませんでした。

これは私のJavaプログラムです...

class Player1 extends Thread
{  
    private Object o;  
    int total=0;  
    Player1 (Object o)
    {  
      this.o = o;  
    }  

    public void run()
    {  
        System.out.println(Thread.currentThread().getName()+ 
                           " is running now...");  
        for(int i=0;i<10;i++)
        {  
             ++total ;  
        }  
        System.out.println(this.getName()+" is "+total+ 
                           " Run! and finished ");  
        synchronized (o)
        {  
            o.notify();  
        } 
    }
}  

class Player2 extends Thread 
{  
    private Object o;  
    int total=0;
    Player2 (Object o)
    {  
      this.o = o;  
    }  
    public void run()
    {  
        try
        {  
            synchronized (o) 
            {  
                o.wait();  
            } 
        }  
        catch (Exception e) 
        {  
            e.printStackTrace();  
        }  
        System.out.println(Thread.currentThread().getName()+ 
                           " is running now");  

        for(int i=0;i<15;i++)
        {  
             ++total ;  
        }  
        System.out.println(this.getName()+" is "+total+ 
                           " Run! and finished ");  
    }  
}  

public class MultiThreading
{  
  public static void main(String[] args)
  {  
        Object lock= new Object();  

        Player1 Amir=new Player1(lock);  
        Amir.setName("Amir");

        Player2 Hossein=new Player2(lock);  
        Hossein.setName("Hossein");  

        Amir.start();  
        Hossein.start();  


        System.out.println("Amir Score is :"+Amir.total);
        System.out.println("Hossein Score is :"+Hossein.total);
    }  

}  

出力は次のとおりです。

Amir Score is :0
Hossein Score is :0
Amir is running now...
Amir is 10 Run! and finished 
Hossein is running now
Hossein is 15 Run! and finished 

私の出力では、プレイヤーが実際にゲームを開始する前に、ゲームの概要がメインスレッドによって出力されます (Amir Score は :0、Hossein Score は :0)。 Thread.Sleep(3000) を使用でき、答えは正しいです。それは良い方法ではないと思います...

これについて教えてください...

貴重なご回答をお待ちしております...

4

3 に答える 3

2

を使用できますCountdownLatch。2 つのクラスを作成するCountdownLatch(2)前に を作成し、それを2 つのスレッドのコンストラクターに渡します。次に、メイン コードで を呼び出します。これはブロックされ、他のスレッドが両方とも呼び出されるのを待ち、それが発生した後にのみ続行されます。作業が終了した後に各スレッドを呼び出すだけで、要約を実行するコードに制御が戻ります。ThreadCountdownLatchlatch.await()latch.countDown()latch.countDown()

class Player1 extends Thread
{  
    private Object o;  
    int total=0;
    private latch:CountDownLatch;  
    Player1 (Object o, CountDownLatch latch)
    {  
      this.o = o;  
      this.latch = latch;
    }  

    public void run()
    {  
        System.out.println(Thread.currentThread().getName()+ " is running now...");  
        for(int i=0;i<10;i++)
        {  
             ++total ;  
        }  
        System.out.println(this.getName()+" is "+total+ " Run! and finished ");  
        synchronized (o)
        {  
            o.notify();  
        } 
        latch.countDown();
    }
}  

class Player2 extends Thread 
{  
    private Object o;  
    int total=0;
    private CountDownLatch latch;
    Player2 (Object o, CountDownLatch latch)
    {  
      this.o = o;  
      this.latch = latch;
    }  
    public void run()
    {  
        try
        {  
            synchronized (o) 
            {  
                o.wait();  
            } 
        }  
        catch (Exception e) 
        {  
            e.printStackTrace();  
        }  
        System.out.println(Thread.currentThread().getName()+ " is running now");  

        for(int i=0;i<15;i++)
        {  
             ++total ;  
        }  
        System.out.println(this.getName()+" is "+total+ " Run! and finished "); 
        latch.countDown(); 
    }  
}  

public class MultiThreading
{  
  public static void main(String[] args)
  {  
        Object lock= new Object();  
        CountDownLatch latch = new CountDownLatch(2);
        Player1 Amir=new Player1(lock, latch);  
        Amir.setName("Amir");

        Player2 Hossein=new Player2(lock, latch);  
        Hossein.setName("Hossein");  

        Amir.start();  
        Hossein.start();  

        latch.await();
        System.out.println("Amir Score is :"+Amir.total);
        System.out.println("Hossein Score is :"+Hossein.total);
    }  

}  
于 2013-05-07T11:36:44.863 に答える