0

マルチスレッドの概念で Java ソケット プログラムを作成しようとしています。クライアントからサーバーへのすべての接続はスレッドです。すべてのクライアントは、自分の情報をサーバーに送信します。

スレッドからすべての値を収集し、それらをすべて文字列の配列に入れる方法を知りたいですか?

このすべてのスレッドを同期する必要がありますか?

Thread t = new Thread()の代わりにonly を使用した場合の違いは何Thread[] t = new Thread(client)ですか?

Thread[]スレッドからすべてのアイテムを収集するために使用する最初のステップに適していますか?

スレッドを使用すると便利join()ですか?

これはスレッドを作成する部分であり、

    public void listenSocket(int client){ 
        int i=0;

        Thread[] t = new Thread[client];
        while(i<client){
            ClientWorker w;
              try{  
                    w = new ClientWorker(server.accept());
                    t[i] = new Thread(w);
                    t[i].start();
                    System.out.println(t[i].getName());
              } catch (IOException e) {
                    System.out.println("Accept failed: 4444");
                    System.exit(-1);
              }
        i++;
        }
}

これは、スレッドが行っていることの一部です

class ClientWorker implements Runnable{
    Socket client;
        String ip;
        String load;
        String data[]=new String[7];


        ClientWorker(Socket client){
        this.client = client;
    }

    public void setIP(String ip){
            this.ip = ip;
        }

        public void setData(String load){
            this.load = load;
        }

        public void getIP(){
           System.out.println(ip);
        }

        public void getData(){
           System.out.println(load);
        }

    public void run(){

        BufferedReader in = null;
        PrintWriter out = null;
                XmlGenerator xml = new XmlGenerator();
        try{
          in = new BufferedReader(new InputStreamReader(client.getInputStream()));
          out = new PrintWriter(client.getOutputStream(), true);
        } catch (IOException e) {
          System.out.println("in or out failed");
        }
                while(true){
                    try{
                        String a = in.readLine();
                        setData(a);
                        String b = client.getRemoteSocketAddress().toString();
                        setIP(b);
                        out.println(a);
                        getData();
                        getIP();
                       }
                    catch (IOException e) {
                        System.out.println("Read failed");
                       }
                }

    }

}`

sync,callable thread に関するトピックを読みましたが、何も見つかりませんでした。再投稿すみません。

4

1 に答える 1

1

これに答えるには、次の 2 つの方法があります。

最初の方法:

スレッドからすべての値を収集し、それらをすべて文字列の配列に入れる方法を知りたいですか? このすべてのスレッドを同期する必要がありますか?

その方法で結果を収集する場合は、その配列のスレッドの使用を明示的に同期する必要があります。

Thread[] t = new Thread(client) の代わりに Thread t = new Thread() のみを使用すると何が違うのでしょうか?

あなたが何を意味するのかは明確ではありませんが、どちらの方法でも、同じデータ構造にアクセス/更新する2つのスレッドがある場合、アプリケーションを信頼性/移植可能にするためにそれらを同期する必要があります。

Thread[] を使用してスレッドからすべてのアイテムを収集する最初のステップに適していますか?

それは一つのアプローチです。しかし、より良いアプローチがあります。

スレッド join() を使用すると便利ですか?

このレベルでこの問題に対処しようとする場合は、役立つ可能性があります。

問題は、あなたのコードが、あなたが何をしているのか明確な考えを持っているという確信をあまり与えてくれないということです. 言い換えれば、デザインの証拠はありません。また、コードがどのように機能するかを理解できない場合、具体的なアドバイスを提供することは実際には不可能です. コードは確かに、質問の冒頭で言っていることと一致していないようです...


これに答える 2 番目の方法は、Java 5 以降では、「java.util.concurrent」パッケージが、マルチスレッド システムを実装するための幅広い「既製の」コンポーネントを提供することです。あなたが実装しようとしているように見えるものは、ExecutorService. スレッドの作成と管理に関するすべての低レベルの詳細を処理でき、アプリケーションが各計算の結果を を介して取得できるようにしますFuture。これにより、明示的な同期の必要がなくなります...ExecutorServiceとのFuture実装がそれを処理します。

したがって、私の推奨事項は、 などの Javadoc を読み、ExecutorServiceそれを使用して何をしようとしているのかを理解することです。そのようにすると、コードはより良くなる可能性があります。

于 2012-08-14T02:07:23.993 に答える