0

次のJavaプログラムを作成する必要があります。

  1. 従業員の名前を格納するArrayListを作成します。
  2. 2つの同期メソッドを作成して、従業員名をArrayListに追加し、従業員名を出力します。
  3. 両方のスレッドが従業員の追加を完了したら、従業員名を印刷します。

私は次のことをしましたが、動作していません。「pr.print(X)」の行で例外が発生しています。誰か助けてもらえますか?これは私の宿題ではありません!!! ただ学ぼうとしているだけです。

import java.util.*;

public class Ch5Ex2 
 {
  public static void main(String[] args) 
   {
    List<String> li = new ArrayList<String>();
    Print pri = new Print();
    pri.start();
    Insert in = new Insert(li);
    in.start();
   }
}   

class Insert extends Thread
{
 Print pr = new Print();
 List<String> x;
 public Insert(List<String> x)
  {
    this.x = x;
  }

public synchronized void run()
 {
    try
    {
      x.add("robin");
      x.add("ravi");
      x.add("raj");
      pr.print(x);
    }
    catch(Exception e)
     {
        e.printStackTrace();
     }
 }

}

class Print extends Thread
{
 List<String> y;
public void print(List<String> y)
 {
    this.y = y;
    notify();
 }

public synchronized void run()
 {
    try
    {
     wait();
     for(int i=0;i<y.size();i++)
      {
         System.out.println(y.get(i));
      }
     }
    catch(Exception e)
    {
        e.printStackTrace();
    }
 }
}   
4

4 に答える 4

2

私はあなたがこれを必要とすると思います:

import java.util.*;

public class Ch5Ex2 {
    public static void main(String[] args) {
        List<String> li = new ArrayList<String>();
        Print pri = new Print();
        pri.start();
        Insert in = new Insert(li, pri);
        in.start();
    }
}


class Insert extends Thread {
    Print pr;
    List<String> x;
    public Insert(List<String> x, Print p) {
        this.x = x;
        pr = p;
    }

    public synchronized void run() {
        try{
            x.add("robin");
            x.add("ravi");
            x.add("raj");
            pr.print(x);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

class Print extends Thread {
    List<String> y;
    public synchronized void print(List<String> y) {
        this.y = y;
        notify();
    }

    public synchronized void run() {
        try {
            while(y == null){
                wait();
            }
            for(int i=0;i<y.size();i++) {
                System.out.println(y.get(i));
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

これでうまくいくはずです...

解決策は次のとおりです。createdinメソッドで実行wait()Print threadているので、先に進むにはこれを実行する必要があります。また、開始前に呼び出された場合、それはになり、その場合はあなたはしません.. :)pri objectmain()notify()pri objectPrint threadnotify()Print threadyPrintnon-nullPrint threadwait()

于 2013-01-14T10:52:02.713 に答える
2

クラスでprはnullだと思います。コンストラクターを呼び出すことはありません。Insert

于 2013-01-14T10:28:53.240 に答える
0

あなたの生活を楽にするために、あなたはあなたのアプリケーションレベルでの同期を忘れて、このようArrayListに呼び出すことによって同期を作成するかもしれませんCollections#synchronizedList()

リストyourArray=Collections.synchronizedList(new ArrayList())

その場合yourArray、別々のスレッドからのすべての呼び出しが同期されます。それに加えて、インスタンス化することは決してないので、nullのように見えます(@ Nikolay Kuznetsovprに感謝します)。

于 2013-01-14T10:32:35.310 に答える
0

prにメモリを割り当てていません。変数Printprを作成しているだけなので、NPEを取得する必要があります。

于 2013-01-14T10:33:27.627 に答える