2016-10-25 1 views
0

현재 디바이스로부터 데이터를 수신하고 지오 펜스 및 기타 관련 로직을 확인하는 것과 같은 긴 프로세스를 수행하고 결국 데이터를 db에 저장하는이 소켓 프로그램이 있습니다. 다음은 내 코드는 소켓을 공공 정적 무효 메인 (문자열 []에 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(); 
      } 


} 

나는 내가 데이터를 읽고 내가 데이터를 확인하고 모든 다양한 기능 등을 호출하고 마지막으로 데이터를 저장 받도록 실행 기능에서 등 기능의 나머지 부분을 호출 여기 /// 표시 한 db. 나는 이것이 긴 과정이라고 생각한다. 나는 데이터를 읽은 다음이 문자열을 별도의 스레드에 전달하여 달성하고자하는 것보다 아래에있는 두 섹션을 하나 부러 뜨리고 싶습니다.

따라서 실행 기능에서이 스레드 t = new Thread (new MyRProcessing (parameter))를 수행 할 계획입니다. t.start(); 나는 이것이 정확하다는 것을 너무 확신하지 못합니까? 별도의 .java로 MyRProcessing을 작성하거나 하나의 java에 모두 넣어야합니까?

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

     public void run() { 
     } 
    } 
+2

들어가기 전에 몇 가지 멀티 스레딩 자습서를 읽는 것이 좋습니다. 복잡한 주제이기 때문에 많은 질문을 던지기 때문에 "날개 달기"를 시도하면 머리를 숙일 것입니다. 그렇지 않으면 장기 실행 프로세스가있는 경우 최소한 생산자 - 소비자 패턴에서 이점을 얻을 수있는 것처럼 보입니다. – Kayaman

+0

예 저는이 스레드를 t = new Thread (새 MyRProcessing (매개 변수)) 호출에 대해 발견 한 일부 및 google을 읽었습니다. – user5313398

+0

내가하려고하는 것이 맞는지 아닌지에 대한 확인이 필요합니까? 실제로 내 문제는 간단합니다. 하나의 스레드로 읽고 나머지 스레드를 다른 스레드로 전달하여 스레드가 다른 스레드로 넘치지 않도록하려면 두 개의 별도 스레드로 나누고 싶습니다. – 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

생산자 - 소비자는 아마도 장기적으로 더 나을 것입니다. 어느 쪽이든 어떤 성능 문제도 알지 못할 것입니다. 한 번에 몇 개의 쓰레드가 실행되기를 기대한다면 간단한 방법만으로도 충분할 것입니다. 한 가지 문제는 한 번에 너무 많은 것을 실행하면 컴퓨터가 질식 할 수 있다는 것입니다. 그것은 모두 당신이 무엇을하고 있는지에 달려 있습니다 –

관련 문제