레이블이 Java인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Java인 게시물을 표시합니다. 모든 게시물 표시

2014년 5월 12일 월요일

Java Thread

1. Thread 란?

 - 프로그램의 실행 흐름, 프로그램을 구성하고 있는 실행 단위
 - 흔히 하나의 흐름으로 구성되어 있는 프로그램을 Single Thread, 여러 작업을 동시에 수행 가능하게 하는 것이 Multi-Thread 다.

2. Multi-Thread 를 사용해야 하는 이유

  단일 스레드 애플리케이션의 문제는 다른 것들이 시작하기 전에 작업을 완료해야 한다는 것에 있다. 멀티스레드는 동시성을 시뮬레이션하는 단일 프로세서 시스템에서 성능을 증가 시킬수 있다. 하나의 쓰레드가 진행할 수 없을 경우 , 다른 것이 프로세서를 사용할 수 있다.

3. Thread 의 라이프 싸이클
 

  새 스레드는 new 상태에서 라이프 사이클을 시작한다. 그것은 스레드를 runnable 상태에
놓으며, 프로그램이 스레드를 시작할 때까지 이 상태로 남아 있다. runnable 상태에서 스레드는 자체 태스크 수행하는 것으로 간주된다.

  때로 runnable 스레드는 다른 스레드가 태스크를 수행하길 기다리는 동안 waiting 상태로 전환한다. waiting 스레드는 기다리는 스레드에 통보할 때만 runnable 상태로 다시 전환한다.
  
  runnable 스레드는 지정된 대기 시간 동안 timed waiting 상태로 들어갈 수 있다.
지정된 대기 시간이 만료하거나 기다리던 이벤트가 발생하면 runnable 상태로 다시 전환한다.

  timed waiting과 waiting 스레드는 프로세서를 사용할 수 없다. 선택적 간격이 제공되는 경우
runnable 스레드는 timed waiting 상태로 전화할 수 있다. 이러한 스레드는 다른 스레드에 의해 통보될 때 혹은 초과 간격이 만료할 때 runnable 상태로 다시 돌아간다.

 스레드를 timed waiting 상태에 놓는 또 다른 방법인 sleep 은 runnable 상태로 돌아간 후에 지정된 시간 동안 timed waiting 상태에 머문다. 스레드는 수행해야 할 작업이 없을 때는 수면 상태가 된다.

 즉시 완료될 수 없는 태스크 수행을 시도하고 , 태스크가 완료될 때까지 반드시 기다려야 할 때 runnable 스레드는 blocked 상태로 전환한다. 예를 들어, 스레드가 입력/출력 요청을 할 때 운영체제는 I/O 요청이 완료될 때까지 스레드가 실행되는 것을 차단하며, 완료 시점에서 blocked 스레드가 runnable 상태로 전환함으로써 실행을 재개한다. blocked 스레드는 프로세서를 사용할 수 없다.

 runnable 스레드는 성공적으로 태스크를 완료할 때 terminated 상태 즉, 죽는다. 또는 종료된다. 

4. 스레드 우선 순위 및 스레드 스케쥴링

  모든 자바 스레드는 운영체제가 스레드가 예약되는 순서를 결정하는데 도움을 주는 
 스레드 우선 순위를 가지고 있다. 

 자바 우선 순위는 MIN_PRIORITY(상수1)~MAX_PRIORITY(상수 10) 사이의 범위다. 

 Default 값으로 NORM_PRIORITY(상수5)가 주어진다.

 ※ 스레드 스케쥴링은 플랫폼 의존적이다. 다중 스레드 프로그램의 동작은 자바 구현에
     따라 다를 수 있다.

 5. Runnables 및 Thread  클래스
  
   자바에서는 Runnable 인터페이스로 구현하거나 Thread 클래스를 상속받아서
  스레드 구현이 가능하다. 그러나 멀티 스레드에서 선호하는 방식은 Runnable 인터페이스다

  Runnable 객체는 다른 태스크와 함께 동시에 실행할 수 있는 "태스크" 를 나타낸다.
  Runnable 인터페이스는 단일 메서드 run 을 선언하여 Runnable 객체가 수행해야 하는
  태스크를 정의하는 코드를 포함한다. Runnable을 실행하는 스레드가 생성되고 시작될 때
  스레드는 새 스레드에서 실행되는 Runnable 객체의 run 메서드를 호출한다.


 Thread 구현 예제


1. PrintTask.Java  

import java.util.Random;

/**
 * Thread 로 선언하는것보다 Runnable 로 하는것이 더 좋으며
 * 멀티 쓰레드 관리를 편하게 하기 위한 테스트 
 * @author blessldk
 *
 */
public class PrintTask implements Runnable{

private final int sleepTime;
private final String taskName;
private final static Random generator= new Random();

/**
* 각각의 task 이름을 받아와서 설정해볼까? 그렇게 하자
*/
public PrintTask(String name){
this.taskName = name;
sleepTime = generator.nextInt(5000);
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(true){
System.out.printf("%s going to for %d milli\n" , taskName , sleepTime);

Thread.sleep(sleepTime);
}
}
catch(Exception e){
e.printStackTrace();
}
System.out.printf("%s done sleeping\n" , taskName);
}

}

2. ThreadCreator.Java


public class ThreadCreator {

public static void main(String[] args) {
System.out.println("Create Thread");
Thread thread1 = new Thread(new PrintTask("task1"));
Thread thread2 = new Thread(new PrintTask("task2"));
Thread thread3 = new Thread(new PrintTask("task3"));
System.out.println("Created Thread Print Task");
thread1.start();
thread2.start();
thread3.start();
System.out.println("task started. main 끝");
}
}


Executor 프레임워크로 스레드 관리

위와 같이 명확하게 스레드를 생성하는 것이 가능하지만, Executor 인터페이스를 사용하여 Runnable 객체의 실행을 관리하는 것을 권장한다.
Executor 객체는 Runnable을 실행하기 위해 스레드 풀(Thread pool)이라고 하는 스레드 그룹을 생성하고 관리한다. Executor를 사용하는 것은 스스로 스레드를 생성하는 것에 비해 장점을 가진다. Executors는 새로운 스레드 생성의 오버헤드를 제거하기 위해 기존의 스레드를 다시 사용할 수 있고 어플리케이션이 리소스를 과도하게 소모하는 너무 많은 스레드를 생성하지 않고, 스레드의 수를 최적화하여 성능을 향상시킬 수 있다.

Executor 인터페이스는 Runnable을 인수로서 받는 execute라는 단일 메서드를 선언한다.
Executor 는 execute 메서드에 전달된 모든 Runnable을 스레드 풀에 있는 스레드 중 하나로 할당한다. 사용 가능한 스레드가 없는 경우, Executor는 새 스레드를 생성하거나 스레드가 사용 가능해지길 기다린다. 

ExecutorService 인터페이스는 Executor를 확장하고 Executor는 execute 메서드에 전달된 모든 Runnable을 스레드 풀에 있는 스레드 중 하나로 할당한다. 사용 가능한 스레드가 없는 경우, Executor는 새 스레드를 생성하거나 스레드가 사용 가능해지길 기다린다.

3. TaskExector.java

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class TaskExecutor {
public static void main(String[] args) {
PrintTask task1 = new PrintTask("task1");
PrintTask task2 = new PrintTask("task2");
PrintTask task3 = new PrintTask("task3");
System.out.println("Starting Executor");
ExecutorService threadExecutor = Executors.newCachedThreadPool();
threadExecutor.execute(task1);
threadExecutor.execute(task2);
threadExecutor.execute(task3);
threadExecutor.shutdown();
System.out.println("Tasks started, main ends");
}
}

2014년 3월 30일 일요일

Java 제 2 강

Java 제 2 강


Java 의 자료형















Java의 연산자







































Java 의 제어문






2013년 9월 24일 화요일

[Team L.A.D] 재학생 Study 02 - Collection 의 이해 - Map0

이제 Map 에 관해서 알아보자.

Map 클래스를 상속받는 아이들은 총 4가지가 있다.


HashTable

- 데이터가 해시테이블에 동기화되어있는 클래스 이다. 동기화가 필요한 부분에서

   사용하기에 용이하다.

HashMap

- HashTable 이랑 거의 비슷하나 , 다른 점은 동기화 되어있지 않으며 , NULL 값을

   허용한다.

TreeMap

 - red-black 트리에 데이터를 담는다. TreeSet 과 다른점은 Value 가 아닌 Key 에 의해서

   순서가 정해진다.

LinkedHashMap

 - HashMap 과 거의 동일하며 , 이중 연결 리스트를 이용하여 데이터를 담는다는

   사실만 다르다.

그럼 이 4가지 맵 중에 누가 빠른가?

hashMap : TotalUsedTime :24 ms
hashTable : TotalUsedTime :21 ms
treeMap : TotalUsedTime :29 ms
linkedMap : TotalUsedTime :26 ms

솔직히...ㅋㅋ 거의 비슷비슷 하다.. 큰 차이가 없다..

역시 TreeMap 이 느리긴 하나..

key 값으로 찾는다는 점이 있고

다른 모든 것은 해시 함수 기법으로 검색 하기 때문에 상당히 빠르다.

그럼 지금까지의 모든 기법을 알아봤으니 뭐가 제일 나은지 정리 해보자

Set - HashSet

List - ArrayList

Map - HashMap

Queue - LinkedList

아마 가장 안정적이고 자주쓰는 것을 자바 에서 지정해줬으리라..

그럼 여기서 끝...

다음엔 더 자세히 해보자~

[Team L.A.D] 재학생 Study02 - Collection List

Collection 2번째 이제 List 에 대해서 알아보자

List 는 기본적으로 사용함에 있어서 Set과 특별한 차이점은 없으나.

넣는대로 Index (색인)이 된다는 점 , 중복을 허용한다는 점이 다르다.

그럼 List 의 종류에 대해 알아보자.

LinkedList

- 서로 앞뒤의 관계에 대해서만 정보를 가지고 있다 . 나머지 사항은 ArrayList와 비슷하다.

- 그러나 LinkedList 는 서로 앞뒤에 대한 Link정보만 갖고 있기 때문에 검색하는데

   상당히 느린 구조를 띈다.

- 그러나 서로의 연결정보만 갖고 있으므로 추가 삭제에는 , 특히 대량으로 Data의

   추가 삭제가 이뤄질 경우 상당히 빠른 구조를 띈다.


ArrayList

- List의 대표적인 클래스고 가장 많이 쓰인다.

- 각 Data가 Index 번호를 갖고 있어서 , 검색에 상당히 용이하다.

- 그러나 Array 의 형태를 띄고있어서 Data삭제 또는 추가시 임시 배열을 만들고

   옮기는 방법을 사용하므로 , Data의 잦은 추가 삭제 , 대량 추가 삭제가 많을 경우에는

   적당하지 않다.


Vector

- 위 2 클래스의 아버지와 같은 클래스로 Java 1.0 부터 사용되어 왔고 , 지금도 가끔

   사용하는 클래스 이긴 합니다.. 기능은 ArrayList 와 동일하나 동기화 기능이 포함되어

   있다는 점이 차이점입니다.


그럼 List 관련 클래스 중 누가누가 빠른가??

Vector
LinkedList
ArrayList

10만 runCount for 문 처리

ArrayList : TotalUsedTime :13 ms
LinkedList : TotalUsedTime :69939 ms
Vector : TotalUsedTime :12 ms


LinkedList Select 시간이 장난아니게 오래 걸리는걸 확인할 수 있다.

여기서 LinkedList 를 순차 처리 할수 있게 poll() 메소드를 사용해보자

ArrayList : TotalUsedTime :13 ms
LinkedList : TotalUsedTime :14 ms
Vector : TotalUsedTime :13 ms

엄청난 차이를 보인다. 

LinkedList 를 조회에도 사용할 경우 poll() 메소드를 반드시 써주자




 

2013년 9월 23일 월요일

[Team L.A.D] 재학생 Study 02 - Collection 의 이해 Set

자 오늘 부터 Collection 을 제대로 이해해 보자.

너무 이건 내용이 방대해서

Set / List / Map 으로 나눠서 설명하고 Queue는 그냥 알아두는 용도로 하겠다.

그리고 기타적으로 Stack Class 에 대해서도 별도로 언급한다.

Set은

순서가 없고 (즉 색인이 없으며) , 중복을 허용하지 않는 Collection이다

Java Class Collection 을 상속받는다.


그럼 Set의 종류는 무엇이 있을까?

1. HashSet

    - 데이터를 해시 테이블에 담는 클래스 , 당연히 순서 없다.

2. TreeSet

    - red-black 이라는 트리에 데이터를 담는다. 값에 따라서 순서가 정해진다.

    - 당연히 HashSet 보다 느리다. 데이터를 담으면서 동시에 정렬한다 하면

       유용하지만.. 그닥 쓰지 않는다.

3. LinkedHashSet

    - 해시 테이블에 데이터를 담는데 , 저장된 순서에 따라서 순서가 결정된다.

※ red-black 트리 : 이진 트리 구조로 데이터를 담는 구조 , 그러나 성능이 영
                            좋지 않은 트리 구조 이므로 사용하지 않길 권유 한다.

자 그럼 Set 명령어 중에 누가누가 빠른가 비교해 보실까 .

비교 대상

HashSet

TreeSet

LinkedHashSet

이 3가지의 속도와 메모리 사용량을 비교한다.

HashSet : TotalUsedTime :50 ms
TreeSet : TotalUsedTime :69 ms
LinkedHashSet : TotalUsedTime :39 ms

3개 모두 빠르지만 , LinkedHashSet 이 가장 빠르다.


2013년 9월 10일 화요일

[Team L.A.D] 재학생 Study01 - Java 에서 String , StringBuffer , StringBuilder 어떻게 활용해야 할까?

1. String을 어떻게 하자는 말인가.

   1-1. String 과 new String 은 어떻게 다른가.

         - Java 를 기준으로 설명 하겠다.

         - 질문 

            1) String a = "abc";
                String b = "abc";

                System.out.println(a==b); //출력값은 true or false?

             2) String a = "abc";
                 String b = new String("abc");

                  System.out.println(a==b); //출력값은 true or false?

                  System.out.println(a.equals(b)); // 출력값은 true or false?

          - 정답은 1번은 true , 2번 문제의 답은 false , true 입니다.

 
          - '==' 은 해당 변수의 Value와 주소값을 함께 비교합니다. 즉, 주소값과
              Value값이 모두 동일해야만 같다라고 인정합니다.

          - 'equals(...)' 는 해당 변수의 Value만을 비교합니다.

          - String을 new String()으로 선언하는 경우에 새로운 인스턴스 주소 값을

             갖게 됩니다. 따라서 Value값이 같다고 해도 주소값이 다르기 때문에

             '==' 으로는 비교해서는 true를 반환 할 수 없습니다.

           - 즉 String으로 변수값만 선언하는 것은 같은 주소 값에서 , Stack으로만

              쌓이는 형태이고 , new String() 으로 선언하는것은 자바 메모리에 다른 주소를

              할당하게 된다.

            - 즉 특별히 , 인코딩 및 세부적인 작업을 해주지 않을 것이라면 String 을 

               새로 생성자를 만들지는 않는게 좋다.

     1-2. 왠만하면 String 을 쓰지 않는게 좋다.정말?

            - 자 여기서 언제 String을 쓰지 말라는 걸까?

            - 설마 선언할 때? 문자열 표현할때? 그런게 아니다.

            - String 은 불변객체 이다 . 즉 한번 생성자로 정의를 내리면 변하지 않는다.

            - 따라서 정한 Value 값이 변할일이 거의 없고 그 값 그대로 쓰인다면

              ( Ex) Label 의 이름 , 단일 String 의 가벼운 Update) String 을 쓰는게 좋다.


       1-3. 그럼 언제 쓰지 말라는건가?      
           
             - String 을 쓸때 이렇게 쓰는 경우가 종종 있다.

             - String a ="a";
                a += "b";

             - 이렇게 for문으로 돌아서 들어간다거나 , 가장 큰 예로 웹 프로그래밍을 할 시

                Query 로 작성할때 String 으로 처리한다.

              - 이럴 경우가 String 을 쓰면 안대는 경우다.

              - 즉 지속적으로 String 문자열이 추가될 경우에 쓰면 안댄다.

              - 이유를 판단해보자. 

              - String class 에 새로운 String 을 추가하게 되면

              - 기존의 String이 아닌 새로운 String 이 생성된다. 즉 주소값이 바뀌면서
                 값이 바뀌게 되고 , 기존의 String 은 GC 대상이 된다.

              - 즉 , 메모리 사용량과 응답 시간이 급속히 증가하게 된다.

        1-4. 이러한 부분들을 해결해 주기 위해 나온 StringBuilder , StringBuffer

              - Java 는 String , StringBuffer , StringBuilder 라는 3가지 문자열을 처리하는

                클래스를 제공합니다. 

              - StringBuffer 와 StringBuilder 에서 제공되는 메소드와 형태는 동일합니다.

              - 다만 차이점은 StringBuilder 는 ThreadSafe 하지 않습니다. 즉 여러 Thread

                 에서 단일 객체를 실행할 경우 문제가 발생합니다. 

              - 그래서 되도록 Java 에서 처리할때는 StringBuffer 로 처리하는 것을 추천한다.

             ※ 예제소스는 별도 첨부 합니다.

              - 예제 소스 String 으로 처리시 used Time  : 1934 ms

              - 예제 소스 String 으로 처리시 메모리 사용량 : 48,290 KB
 
              - 예제 소스 StringBuffer 처리시 used Time  : 25 ms
             
              - 예제 소스 StringBuffer 처리시 메모리 사용량 : 3,576 KB

              - 예제 소스 StringBuilder 처리시 used Time  : 22 ms
  
              - 예제 소스 StringBuilder 처리시 메모리 사용량 : 3,576 KB

            1-5. 그러나 Java 는 대안을 내놓았다.

                - JDK 1.5 이상일 경우 컴파일 시 StringBuilder로 자동 변환 시켜줍니다.

                - 허나 메모리를 많이 사용한다는 부분은 변동이 없습니다. 

                - 따라서 믿지 말고 원칙대로 사용하자
              
     
결론  및 요약          

String 은 문자열 Data 의 Update 또는 가벼운 추가 정도로 사용한다.

StringBuffer 는 Thread의 안전과 활용이 중요하거나, 현재 Thread 안전성을 정확히

판단하기 어려울 때 사용한다.

StringBuilder 는 그다지 안전성이 중요하지 않고 , 간편한 프로그램에서 사용한다.

StringBuffer 와 StringBuilder 는 비슷하니 되도록 StringBuffer 를 사용하는 것이 좋겠다.


끝~




2013년 8월 29일 목요일

Java Developer Day - 5 Session Extend your Java experience to Mobile Application

정보람 - Oracle Fusion Middleware

ADF 제발 사용해주세요 라는 소리네..

근데 이건 이미 Unity3D 에서도 지원해주고 있고 ,

아무래도 Oracle 역시 크로스플랫폼 의 트랜드를 따라가려고 하는 것으로 보인다.

앞에 4Session 에서 발표한 내용의 확장성 내용이라서

특별한 내용은 없다.

참조 사항 단어

AMX ( ADF Mobile XML Components)

ADF Controller

ADF Binding

Device Features Interaction

Native Push Notification Support

Focus On Reusability

ADF Mobile Architecture

그치만 발표하는 사람은 이쁘다..ㅋㅋㅋㅋㅋ


2013년 8월 28일 수요일

Java Developer Day - 2 Session The Java EE 7 Platform Productivity++ and HTML5

이창재 - 시니어 아키텍트

blogs.oracle.com/jaylee

Java EE 7 PlatForm ; 2013.06.12

Java EE 7 메인테마

1. 개발자 생산성

    - 코드 단순화
    - 더욱 쉬워진 통합
    - POJO를 위한 좀 더 다양한 annotation 지원

2. HTML 5

   - Web Socket
   - JSON
   - REST
   - NIO 2.0

3. 기업의 요구사항 충족

    - Batch(?)
    - JMS API

10 가지 특징

1. WebSocket
2. JSON
3. JAX-RS API
4. JSF 2.2

이정도가 중요해 보인다...

1. JSR 356 : Java API WebSocket 1.0

Socket의 끝과 라이프 사이클을 Annotation 으로 가능하다.

패키징 및 배포가 가능하다.

개발의 Annotation 화 시키는데 주력하고 있다.

2. JSON Processing 1.0

   - JSON 을 이제 표준으로 넣었다. 잘했지?

   - JSON 파싱 및 생성을 위한 API

   - Streaming API 와 Object Model API는 원래 지원 되었던 거라서..
   - JSON 썼던 사람이라면 딱히 신기하진 않다.


3. Java API for RESTful Web Services 2.0

   - 클라이언트 API
   - S/C 의 비동기 처리를 지원한다.
   - Client 처리가 상당히 깔끔해 졌다 . WebService 를 쓴다면 반드시 쓰고
     소스가 깔끔해지는 것을 확실히 느낄 수 있다.

4. JSF 2.2

HTML5 친화적으로 변했습니다..

   - HTML5 doctype 으로 렌더링 (그래서 다르게 렌더링하려면 또다른  Setup이 필요함)
 
5. JSR 236 : Concurrency Utilities for Java EE 1.0

   - JNDI 를 이용해서 ManagedExecutorService 에 Task 전달

6. Servlet 3.1

   - Non-blocking I/O
   - Protocol Upgrade
   - 이제 명시적인 HTTP 메소드를 지정할 수 있다 보안 강화

   - Data가 들어올때 처리하도록 변경되었다 , 그리고 Input이 들어올 준비가 됐다면
     수행하도록 바꼈다.

7. Bean Validation 1.1

8. Java Transaction API 1.2

Java Devloper Day - 1 Session 신규 플랫폼의 기회 , 그리고 Java

한국오라클 최윤석

Hyper Cycle for Emerging Technologies , 2012

-  기술 Trigger

-  관심의 고조

-  침체기

-  Slope of Enlightenment

-  성장기

-----------------------------------------------
2012 년 기준화

Big Data , BYOD , Cloud Computing , Internet of Things , Private Cloud Computing

2013 Hyper Cycle for Emerging Technologies

2013 년 기준 화

Big Data 는 여전히 핫 이슈화 되어 있고 , Cloud Computing 은 문제점이 점점 들어나면서
보완 시기로 접어든 것으로 보인다.

Internet Of Things

- ARM : Seninode회사 인수 Sensinode 회사는 저전력 프로토콜을 만드는데 주도적인 회사

- ARM 이 저전력 저비용으로 어떻게 통신을 원활하게 할 것인가를 연구하고

   Smart Process와 접목시킬 목적으로 인수했다고 봐야 한다.

Raspberry Pie : An ARM GNU/Linux BOx ($35)

Raspberry Pie 로 Add On 기능이나 다양한 HW 를 접목해 볼 수 있다.


구글 글래스 : Wearable Computing

Apple iWatch 는 어떻게 나올 것인가?

결론 ,

시장은 여러가지 Wearable Computing 시도를 많이 해보고 있고 , 그것에 대한 발전은
계속 이루어질 것이다.

참고

Smart Citizen Kit

IOE Development Kit