[ Java.Thread-2. Thread만드는 방법 ]


1. java에서 Thread만드는 방법

   - 자바에서는 쓰레드를 만드는 방법이 두 가지 존재 한다.

   - API차원에서 쓰레드를 지원해주고 내가 만드는 클래스를 쓰레드로 만들어 작업을 하려면 클래스를 쓰레드클래스로 만들어야 한다.

   1) Thread 클래스를 상속받아 작성

   2) Runnable 인터페이스를 상속받아 작성



2. Thread 클래스를 상속받아 작성 방법

    1) Thread클래스를 상속받는 클래스를 작성한다.     

        public classs 클래스명 extends Thread {}


    2) public void run()를 오버라이딩한다.

       => 독립적인 실행흐름으로 작성하고 싶은 코드를 run메서드에 구현한다.

 

                 public void run(){

                     //여기에 구현

                  }


     3) 쓰레드 객체를 생성하여 start()를 호출한다.

       => start()에 의해서 JVM이 쓰레드 프로그래밍 작업을 수행할 준비를 하며 내부 스케쥴러에 의해서 적절한 시기에 run 메서드가 호출된다.



3. Runnable 인터페이스를 상속받아 작성 방법

    => 다른 클래스를 이미 상속받고 있는 경우 'Thread클래스를 상속받아 작성하는 방법'만 지원하면 멀티쓰레딩을 할 수 없다.

       따라서, Runnable을 구현하는 방법을 통해 다른 클래스를 이미 상속받고 있다고 하더라도 멀티 쓰레드를 구현 할 수 있다.

   1) Runnable 인터페이스를 상속한다.

      public class 클래스명 extends 상위클래스 implements Runnable{ 

         ....

      }

   2) run 메서드를 오버라이딩한다.

       => Thread 클래스를 상속받을 때와 동일한 방법으로 run을 오버라이딩하여 독립적인 흐름으로 실행하고 싶은 내용을 기술한다.

           public void run(){

            ...

           }


   3) thread 객체를 생성한다. 

      이 때 작성해놓은 Runnable을 상속받는 객체를 생성해서 매개변수에 지정한다.

       Runnable 하위객체 obj = new Runnable 하위객체();

       Tread t = new Tread(obj);


   4) thread 클래스의 Start를 호출한다.

      => Start를 호출하면 내부적으로 Thread 객체를 생성하면서 전달받은 Runnable 하위객체의 run을 호출한다.

         (역시 적절한 시점에 JVM에 의해 호출)



Posted by 농부지기
,

[ Java.Thread-1. 기본개념 ]



1. Thread 정의

   - 프로그램이 실행되는 순서는 코드를 위에서 아래로 순차적으로 처리 되는 방식을 가진다.

     예) "선언문 -> 분기문 -> 반복문 -> 리턴"구조로 개발했을 경우 

         프로그램의 실행순서도 "선언문 -> 분기문 -> 반복문 -> 리턴"순서 그대로 처리 된다.


    - 이러한 흐름을 (Thread)에 비유해서 스레드(Thread)라고 한다.

      일부러 스레드를 개발하려 하지 않아도 기본적으로 메인스레드(Main Thread)구조로 작동된다.

      메인스레드는 시스템이 우리의 프로그램을 돌리기 위한 가장 기본적인 스레드가 된다.

   

    - 그래서 우리는 이 시스템 스레드인 메인 스레드를 제어하거나 컨트롤을 할 수 없다.

      하지만 자바에서는 프로그래머가 직접 제어하거나 컨트롤 할 수 있는 스레드를 생성하여 사용할 수 있다.

      이러한 스레드를 워킹스레드(Working Thread)라고 한다.


2. Thread 사용이유 1

   - 예를 들어, 서버 기반의 스마트폰 게임을 보면

     서버와 통신을하기 위해 소켓을 열어두고 대기하게 된다.

     하지만 소켓만 열어두고 가만히 있으면 이 소켓이 끊겼는지 아니면 끊기지 않았는지 알 방법이 없다.

   - 그래서 소켓 통신에서는 일정 주기마다 서버로 핑을 날려 이 소켓이 유효한지 아닌지 검사하게 된다.

   - 또, 소켓 통신에서는 일정 주기마다 서버로부터 온 데이터를 확인하고, 서버로 보낼 메시지를 전달한다.

   - 이러한 일련의 작업을 메인스레드에서 하게 된다면 어떻게 될까?

     메인스레드는 게임을 하기 위한 UI(User Interface)부분을 그려주고 그래픽 부분을 담당하게 되는데 코드는 순차적으로 실행되기 때문에 UI를 그리는 동안 정작 통신을 담당하는 소켓부분을 방치하는 수 밖에 없다.

     그러므로 통신을 담당하는 스레드를 하나두어 일정한 시간단위로 체크할 수 없도록 하게 하는 것이다.

    

3. Thread 사용이유 2

   - 영상통화를 하는 예,

   - 간단하게 영상을 받아 뿌려주는  소스와 영상을 만들어 보주는 소스.

     이 두 가지 작업이 동시에 수행 되어야 됨.

     이렇게 두 가지 이상의 일을 스레드를 통해 구현된 프로그램을 멀티스레드 프로그램(Multi Thread Progradm)이라고 한다.


4. Thread  종류

   - 메인스레드 : 프로그램을 실행하기 위한 시스템 스레드

   - 워킹스레드 : 프로그램머가 생성하고 제어할 수 있는 스레드 


5. 워킹스레드

    - 워킹스레드는 메인스레드에서 생성하여 실행하게 된다.

      그렇다고 워킹스레드가 메인 스레드에 종속되었다고 보기 힘들다.

      왜냐하면 한 번 실행된 워킹스레드는 메인스레드가 종료되어도 단독으로 실행되기 때문이다.

    - 그래서 메인스레드는 종료될 때 사용중인 모든 워킹스레드를 종료하고, 마지막에 자신이 종료되어야 한다. 

    - 그렇게 하지 않는다면 메모리와 CPU의 자원을 워킹스레드가 다 차지하게 되어 시스템이 뻗어버릴것이 자명하기 때문이다.

       (메인스레드를 종료할 때 반드시 워킹스레드를 종료해야 한다.)

 

Posted by 농부지기
,

[ Socket(TCP/IP).서버와 클라이언트 코딩 과정 ]


1. 서버와 클라이언트간에 메세지전송시 코딩 과정을 그림으로 도식화 해 봤다.

   도식화 이미지 : http://www.crocus.co.kr/425   (C언어도 작성됨.  소켓 개념파악에는 좋음)


2. 서버단

   1. Socket

      - 소켓은 커널의 입장에서는 커뮤니케이션의 종점이다. 

      - 프로그램 입장에서는 읽고/쓰기를 네트워크를 통해 가능하게 해주는 역할이라고 볼 수 있다.

        즉, 소켓은 데이터가 들어오고 나가는 출입구 같은 역할을 한다.

   2. Accept

      - accept() 함수로 클라이언트측 주소정보를 저장할 공간을 만들고 대기상태로 만든다.


3. 클라이언트 단

   1. Socket

      - 서버와 마찬가지로 통신을 위한 소켓을 정의 하고 열어야 한다.

   2. Connect

      - 서버의 주소를 담고있는 addr 구조체를 이용하여 서버에 접속을 시도한다.

Posted by 농부지기
,

[ Java.한글자르기 (깨짐방지) ]


java에서 바이트단위로 문자열 자르기(깨짐방지)

 - http://blog.naver.com/PostView.nhn?blogId=bak35u&logNo=10030674501


java에서 바이트단위로 문자열 자르기(깨짐방지)

 - http://nuninaya.tistory.com/48


java에서 한글자르기(깨짐방지)

 - http://dev4u.tistory.com/entry/Java-%ED%95%9C%EA%B8%80%EC%9E%90%EB%A5%B4%EA%B8%B0


java에서 한글.영문 같은 길이로 자르기

  - http://blog.naver.com/jeany4u/20003783898


Posted by 농부지기
,

'자바(java) > 기본문법' 카테고리의 다른 글

C#-기술집 URL  (0) 2018.02.02
Java. Annotation  (0) 2017.03.12
Posted by 농부지기
,

[ java-reflection(리플렉션). class dynamic하게 호출 ]



Posted by 농부지기
,