2016-10-25 12 views
0

現在、私はデバイスからデータを受信し、ジオフェンスやその他の関連するロジックをチェックするような長いプロセスを実行し、最終的にデータをdbに保存するソケットプログラムを持っています。以下はソケットデータを取得した後、後続の処理のために別のスレッドを呼び出しますか?

これにソケット のpublic static無効メイン(文字列[] args)を起動するためのコードをどのように見えるか、私のコードである{ここで

 new commS(); 
    } 
    commS() { 

    try { 
     // setup the connection pool 
      HikariConfig config = new HikariConfig(); 
      config.setJdbcUrl("jdbc:mysql://localhost:3306/****"); 
      config.setUsername("*****"); 
      config.setPassword("*****");  
      config.setMaximumPoolSize(20); 
      //config.setPartitionCount(1); 
      connectionPool = new HikariDataSource(config); // setup the connection pool   
     } 
     catch (Exception e) { 
      e.printStackTrace(System.out); 
     } 
     try 
     { 
       final ServerSocket serverSocketConn = new ServerSocket(8000);     
       while (true) 
        { 
         try 
         { 
           Socket socketConn1 = serverSocketConn.accept(); 
           new Thread(new ConnectionHandler(socketConn1)).start();      
         } 
         catch(Exception e) 
         { 
          System.out.println("MyError:Socket Accepting has been caught in main loop."+e.toString()); 
          e.printStackTrace(System.out); 
         } 
        } 
     } 
     catch (Exception e) 
     { 
     System.out.println("MyError:Socket Conn has been caught in main loop."+e.toString()); 
     e.printStackTrace(System.out); 
     //System.exit(0); 
     } 

は、接続ハンドラをしてソケット接続コードの残りの部分であります。

class ConnectionHandler implements Runnable { 
     private Socket receivedSocketConn1; 
    ConnectionHandler(Socket receivedSocketConn1) { 
     this.receivedSocketConn1=receivedSocketConn1; 
    } 

public void run() { // etc 
    w = null; 
    BufferedReader r = null; 
    String message=""; 
    try { 
      /// here I read for the data and call the rest of the function etc. 
      I would like to split into separate thread? 
    } 
    catch (SocketTimeoutException ex) 
      { 
       System.out.println("MyError:SocketTimeoutException has been caught in in the main first try"); 
       ex.printStackTrace(); 
      } 
      catch (IOException ex) 
      { 
       System.out.println("MyError:IOException has been caught in in the main first try"); 
       ex.printStackTrace(); 
      } 


} 

私は私がデータを読んで、私がデータを受信その実行機能では、関数などの残りの部分を呼び出し、すべての様々な他の機能などを検証し、呼び出し、最終的にデータを保存し、ここ///マークしていますデータベース。私はこれが長いプロセスだと感じています。私は2つのセクションを1つだけデータを読み取って、このデータの文字列を別のスレッドに渡すためにそれを壊したいので、達成しようとしているものが正しいかどうかを確認してください。

したがって、実行機能では、このスレッドを実行する予定です。t = new Thread(new MyRProcessing(parameter)); t.start();私はこれが正しいと確信していませんか?別の.javaとしてMyRProcessingを記述するか、またはすべてを1つのjavaに入れる必要がありますか?

public class MyRProcessing implements Runnable { 
     private X parameter; 
     public MyRProcessing (X parameter) { 
     this.parameter = parameter; 
     } 

     public void run() { 
     } 
    } 
+2

マルチスレッドチュートリアルを読む前に、いくつかのチュートリアルを読むことをお勧めします。それは複雑なテーマです。あなたが非常に多くの質問をしているので、あなたが "翼を立てよう"とすれば、あなたは頭の中にいるでしょう。そうでなければ、長期的なプロセスがあれば、生産者 - 消費者パターンから少なくとも少しは利益を得ることができるようです。 – Kayaman

+0

はい私はこのスレッドを新しいスレッド(新しいMyRProcessing(パラメータ))を呼び出すことについて発見したいくつかのGoogleとこれを読んだ。 – user5313398

+0

私は何をしようとしているかどうかの確認が正しいかどうかを確認する必要がありますか?実際に私の問題はシンプルですが、別の2つのスレッドを1つのスレッドとして読み込み、残りの処理を別のスレッドに渡したいので、メインスレッドが他のすべての処理でオーバーロードされないようにしたいのですか? – user5313398

答えて

1

あなたは私は非常に先に進む前に、それらの上に読書をお勧めします、生産者 - 消費者here

これはmultithreadingsynchronizationの一般的な質問を扱うための例を見つけることができます。

あなたが提案していることを行う最も簡単な方法は、単にThreadクラスを拡張し、コンストラクタ経由でデータを渡してからrun()メソッドで処理することです。ほとんどの場合、これを行うのが最良の方法ではありませんが、単純です。

Ex。

public class MyThread extends Thread { 
    private String data; 
    public MyThread(String data) { 
     this.data = data; 
    } 

    public void run() { /* process data */ } 
} 

その後、スレッドを起動すると、完了するとスレッドが終了し、スレッドが終了します。

+0

リンクありがとうございました私のコードを変換するのに最も簡単で最速の方法を達成しようとしていましたが、かなり長いですか? – user5313398

+0

あなたの意見では、私は現在のコードを残すか、このプロデューサー - コンシューマーコードに変更する必要がありますか?これまでのところ心配していたメモリの使用量とスケーラビリティに関して、現在のコードに大きな影響がありますか? – user5313398

+0

生産者 - 消費者はおそらく長期的には良いでしょう。あなたはたぶんパフォーマンスの問題に気付かないでしょう。一度にいくつかのスレッドが実行されることを期待しているのであれば、簡単な方法で処理するのは大丈夫です。 1つの問題は、一度に実行するにはあまりにも多くを取得する場合、これがあなたのコンピュータを窒息させることができるということです。それはすべてあなたが何をしているかによって異なります –

関連する問題