Java Thread

Java 2009. 5. 25. 12:17
□ Thread
   - 현재 실행중인 Application 내부에 독립된 하나의 process를 생성하여 Multi Processing을 가능하게 해주는 객체
   - class가 Thread 객체를 상속받거나 Runnable Interface를 implements 받아 run 함수를 구현해주면 되는데 
      Card 객체를 이미 상속받고 있으므로 Runnable Interface를 implements 받으면 된다.
○ Thread의 중요 함수
   1. Thread.sleep(int sleepTime)
      - Thread에  Delay를 주는 매우 중요한 함수이다.
      - sleep Time은 Application의 속도를 단말기의 상이한 성능에도 동일한 속도를 줄 수 있다.
      - sleep Time의 중요한 역할은 Application의 속도 조절 외에도 느린 하드웨어에 따른 오류를 방지하는 역할도 수행
   2. Thread.yield()
      - Thread가 가동이 되면 Thread가 메모리를 장악하게 된다.
      - 이 때, 다른 Thread의 메모리 접근을 차단시켜 VM이 제대로 활동할 수 없게 될 수도 있다.
        따라서 Thread가 장악하고 있는 메모리를 다른 Thread도 접근이 가능 하도록 메모리를 양보해 주는 것이 좋다.
○ Thread 사용
   1. System Thread
      - VM에서 기본적으로 2가지 Thread를 운영한다.
      - 예외 상황 감시 Thread : 저 전압, 전화, sms등 단말기 시스템의 예외 상황을 감시하는 Thread
      - 하드웨어 통신 Thread :
         VM에서 하드웨어에게 메시지를 전달하거나 하드웨어가 VM에게 메시지를 전달할 경우 이를 감지하기 위한 목적
      - SKVM에서 사용한 이벤트 큐 감시 Thread는 리스너로 대체 되었다.
   2. User Thread
      - 많은 Thread를 운영하게 되면 시스템에 과중한 부하를 줄 수 있다.
      - Main Thread : Application을 운영하기 위해 운영하는 Thread
      - 네트워크 관리 Thread : 
         대부분 단발성 Thread로 운영. 네트워크 통신 동안에는 Blocking이 걸리게 되어 네트워크 관련된 작업은 별도의
         Thread로 운영한다.
○ Thread 사용 방법
   1. Thread를 사용하기 위해서 Runnale를 implements 하기
      public class ThreadCard extends Card implements Runnable {
   2. Thread 클래스 선언
      Thread t;
   3. 생성자에 Thread객체 생성하고 start()해주기
      t = new Thread(this);   // 어떤 메소드를 Thread 시켜줄지 지정해줘야 함
      t.start();                      // 여기서는 class내의 run() method, run()은 따로 독립적으로 돌림
   4. Thread run() Method 선언
      public void run() {
         try {
            Thread.yield();
         } catch( Exception e ) { }
         while(true) {
            try {
            } catch( Exception e ) { }
         }
      }



□ Timer
   - Runnable Interface 상속받은 class
   - Runnable Interface의 기능을 강화하여 만든 class
   - 별도의 class를 생성하여 사용
   - TimerTask 객체 내부의 run 함수를 구현하여 Timer.scheldule 함수를 이용해 수행 시킨다.
   - TimerTask의 run 함수는 Timer.schedule() 함수 호출시 자동 호출 되며 그 후에는 이벤트가 발생했을때 호출된다.
   - Timer를 종료하고 싶을 때는 Timer.cancel()함수를 사용하면 된다.
   - 무한으로 반복하는 것이 아니라 주기적으로 실행할때 사용한다.
   - Timer.schedule()를 사용하여 주기적으로 작업을 실행시키고 Timer.cancel()를 사용하여 중지한다.
○ 사용방법
   1. TimerTask class를 사용하기 위해 import java.util.*;
   2. TimerTask 상속받기 public class T_T extends TimerTask
   3. Card객체 생성 TimerCard card;
   4. 카드안에 존재하는 멤버를 모두 사용하기 위해서 카드객체 생성
      public T_T(TimerCard card) {
         this.card = card;    // 자기의 주소값을 넘겨줌
      }
   5. Thread를 사용하기 위한 run() Method 구현
      ....
      card.display.flush();
      // paint() mathod가 끝나야지만 Back-Buffer내용을 갱신할 수가 있는데
      // 수동으로 설정하는 방법 : flush()를 사용해서 내부의 버퍼의 내용을 화면에 출력 하기도 한다.



□ Thread와 Timer의 차이점
○ Thread는
   1. Runnable를 구현
   2. run() Mathod를 구현
   3. start() Method로 시작
○ TimerTask
   1. TimerTask를 상속
   2. run() Method를 구현
   3. Timer.schedule()로 실행
   4. Timer.cancle()로 중지
○ CallSerially
   - callSerially 함수는 Display 객체 내에 구현되어 있으며 인수로 Thread 객체를 받는다.
   - callSerially() Method 호출시 자동으로 Thread 객체가 생성이 되며 생성자 종료시, 
     또는 드로잉 이벤트 발생시 run 함수가 자동 호출된다.
   - callSerially() 사용할때 주의할점 : 한번만 run() Method를 호출하기 때문에 화면갱신을 완벽하게 만들어야 
                                                    Thread가 멈추지 않음

posted by 느릅나무™

Java 현재시간, 날짜

Java 2009. 5. 25. 11:45
□ 현재 시간, 날짜 구하기
// 밀리초 (1000 = 1초)
long lTime = System.currentTimeMillis();
System.out.println(lTime.toString());

// 현재 시간
Data dDay = new Date();
System.out.println(dDay);

// 포맷을 지정해서 날짜 구하기
SimpleDateFormat sdf = new SimpleDateFormat("yyy.MM.dd HH:mm:ss", Locale.KOREA);
Date dTime = new Date();
String sTime = sdf.format(dTime);
System.out.println(sTime);



□ Date를 Calendar로
Date d = new Date();
Calendar c = Calendar.getInstance();
c.setTime(d);



□ 날짜를 n만큼 이동시키기
// case 1
Date d = new Date();
long lTime = d.getTime();
lTime = lTime + (24*60*60*1000) * n;

// case 2
// 오늘
Calendar cal = Calendar.getInstance();
// 2달 전
cal.add( cal.MONTH, -2 );
// 2일 전
cal.add( cal.DAY_OF_MONTH, -2 );
// 2년 후
cal.add( Calendar.YEAR, 2 );
// print
System.out.println( cal.get( cal.YEAR ) );
System.out.println( cal.get( cal.MONTH ) + 1 );
System.out.println( Calendar.DAY_OF_MONTH ) );



□ 해당하는 달의 마지막날 구하기
// case 1
GregorianCalendar today = new GregorianCalendar();
int endDay = today.getActualMaximum( ( today.DAY_OF_MONTH ) );
System.out.println( endDay ); 

// case 2
Calendar cal = Calendar.getInstance();
cal.set ( 2008, 0, 1 ); //월은 0부터 시작
int endDay = cal.getActualMaximum ( Calendar.DATE );
System.out.println(endDay);



□ 요일구하기
Calendar cal= Calendar.getInstance ( );
//day_of_week가 1이면 일요일, 2이면 월요일.... 7이면 토요일
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );



□ 날짜, 시간 유효성 검사
// case 1
try {
   DateFormat df = DateFormat.getDateInstance( DateFormat.SHORT );
   df.setLenient( false );
   Date dt2 = df.parse( dt );                       
} catch(ParseException e) {
} catch(IllegalArgumentException e) {
}

// case 2
String result = "";
dateValue = dateValue.replaceAll("-", "");
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMM", java.util.Locale.KOREA);

//일자, 시각해석을 엄밀하게 실시할지 설정함
//true일 경우는 엄밀하지 않는 해석, 디폴트
formatter.setLenient ( false );
Date formatDate = null;
try {
   formatDate = formatter.parse( dateValue );
} catch(java.text.ParseException e) {
   return "ERROR";
}



□ 두 날짜 비교
Date date1 = new Date();
Date date2 = new Date();
long ldate1 = date1.getTime();
long ldate2 = date2.getTime();
long diff;
diff = ldate2 - ldate1;
//결과값이 몇시간, 몇일 차이나는지 확인하기 위해선.
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis( diff );
posted by 느릅나무™

Java split 사용법

Java 2009. 5. 25. 11:30
□ 문자열을 구분자로 자를때

- "1:2:3::::" 문자열을 ":" 기준으로 자른다.
○ limit 가 0 인 경우
   String abc = "1:2:3::::";
   String regex = ":";
   int limit = 0;
   String[] results = abc.split(regex, limit);

   결과 ("1", "2", "3")
   zero length string 은 무시된다.

○ limit 가 양수인 경우
   String abc = "1:2:3::::";
   String regex = ":";
   int limit = 5;
   String[] results = abc.split(regex, limit);

   결과 ("1", "2", "3", "", "::")
   배열의 최대갯수는 limit를 넘지 못한다.

○ limit 가 음수인 경우
   String abc = "1:2:3::::";
   String regex = ":";
   int limit = -1;
   String[] results = abc.split(regex, limit);

   결과 ("1", "2", "3", "", "", "", "")
   zero length string 도 포함한다.



□ 문자열 나누기 ( StringTokenizer, split의 차이 )

   String str = "ibzkenshin,nowon,,abc@kbs.com";

   String[] values = str.split(",", 4);
   out.println(str+"<br>");

   for( int x = 0; x < values.length; x++ ){
        out.println( "문자(열) " + (x+1) + " : " + values[x] +"<br>");
   }

   StringTokenizer tokens = new StringTokenizer( str, "," );
   out.println(str+"<br>");

   for( int x = 1; tokens.hasMoreElements(); x++ ){
       out.println( "문자(열) " + x + " : " + tokens.nextToken() + "<br>");
   } 

   // 결과

   * split는 값의 갯수를 주면 빈값도 처리되나 제한값을 알아야 한다.

      kk,mmm,,abc@hanmail.net
      문자(열) 1 : kk
      문자(열) 2 : mmm
      문자(열) 3 :
      문자(열) 4 : abc@hanmail.net 

   * StringTokenizer는 빈값은 무시하고 처리한다.

      kk,mmm,,abc@hanmail.net
      문자(열) 1 : kk
      문자(열) 2 : mmm
      문자(열) 3 : abc@hanmail.net


posted by 느릅나무™