'Programming/Java'에 해당하는 글 56건

Stream은 장치(device)로부터 데이터를 입/출력할 수 있게 합니다.
장치에는 파일, 키보드, 모니터, 마우스, 메모리, 네트워크 등이 해당됩니다.

 

 

Stream의 구분

 

  • 문자 단위로 처리하는 문자 스트림(Reader/Writer)
  • 바이트 단위로 처리하는 바이트 스트림(InputStream/OutputStream)

 

 

이 중 표준 입출력 스트림은 이미 지금껏 많이 사용해 왔습니다.
System.out / System.in / System.err
표준 입출력(Standard IO)이란 장치를 특별히 지정하지 않았을 때 사용되는 것입니다.
이들은 System 클래스에 static 멤버로 선언되어 있기 때문에 어디서나 즉시 사용할 수 있습니다.

 

package java.lang;
public class System {
    public static PrintStream out;
    public static InputStream in;
    public static PrintStream err;
}

 

위에서 out과 err는 PrintStream형으로 자료형까지 같지만 둘의 차이점은,
err로 출력되는 것은 리다이렉트(Redirect)되지 않고 콘솔에서만 확인이 가능하다는 것입니다.

 

아래는 데이터의 입력과 출력을 보여주는 간단한 예입니다.

 

import java.io.*;
public class StandardIO 
{
	public static void main(String[] args) throws IOException
	{
		// 한 글자를 입력받아 i에 할당
		int i = System.in.read();
		System.out.println(i);
	}
}

/*
$ java StandardIO
a
97
*/

 

위 예는 하나의 타이핑을 입력받고 엔터를 누르면 아스키 코드값을 출력하는 예입니다.
System.out.read() 를 사용하면 반드시 에러처리를 해주어야 합니다.
위의 예처럼 한 글자만이 아닌 여러 글자를 처리하려면 main 부분을 아래처럼 변경합니다.

 

int i;
// 엔터가 입력될 때까지
while( (i=System.in.read()) != '\n' ) {
	// 아스키코드 숫자를 문자로 변경
	System.out.print( (char)i );
}

/*
$ java StandardIO
hello
hello
*/


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Thread Priority

Programming/Java 2006. 10. 31. 19:30
Thread Priority (스레드의 우선권)

스레드의 우선권(Priority)을 어떻게 주느냐에 따라서 스레드의 작업 순서가 달라진다.
우선권이 높으면 Run 상태를 많이 차지하여 다른 스레드들 보다 작업을 빨리 끝낼 수 있다.

스레드의 우선권을 설정하기 위해서 setPriority() 메소드를 사용하고, 현재 설정되어 있는 우선권을 얻어내기 위해서 getPriority() 메소드를 사용한다.
스레드의 우선권을 셋팅하기 위해서 1부터 10까지의 수를 사용해도 되며, Thread의 스태틱 우선권 상수변수를 사용해도 된다.

♣ Thread 클래스의 스태틱 우선권 상수
  • public static final int MIN_PRIORITY = 1;
  • public static final int NORM_PRIORITY = 5;
  • public static final int MAX_PRIORITY = 10;
/**
스레드의 우선권을 테스트하는 예제
**/
class PriorityThread extends Thread {
  public void run() {
    int i = 0;
    System.out.print( this.getName() );  // 스레드의 이름 출력
    System.out.println( "[우선권:" + this.getPriority() + "]시작\t" );
    while ( i < 100000 ) {
      i++;
      try {
        this.sleep( 1 );  // 작업을 약간 지연 시킴, 우선권을 눈으로 확인하기 위함
      } catch( Exception e ) {
        System.out.println( e );
      }
    }
    System.out.print( this.getName() );
    System.out.println( "[우선권:" + this.getPriority() + "]종료\t" );
  }
}

public class PriorityThreadMain {
  public static void main( String[] args ) {
    System.out.println( "Main 메소드 시작" );
    // 1~10 우선권 부여
    for ( int i = 1; i <= 10; i++ ) {
      PriorityThread s = new PriorityThread();
      s.setPriority( i );
      s.start();
    }
    System.out.println( "Main 메소드 종료" );
  }
}
// output
Main 메소드 시작
Thread-6[우선권:6] 시작
Thread-7[우선권:7] 시작
Thread-8[우선권:8] 시작
Thread-9[우선권:9] 시작
Thread-5[우선권:5] 시작
Thread-10[우선권:10] 시작
Main메서드종료
Thread-3[우선권:3] 시작
Thread-4[우선권:4] 시작
Thread-1[우선권:1] 시작
Thread-2[우선권:2] 시작
Thread-10[우선권:10] 종료
Thread-8[우선권:8] 종료
Thread-9[우선권:9] 종료
Thread-6[우선권:6] 종료
Thread-7[우선권:7] 종료
Thread-5[우선권:5] 종료
Thread-3[우선권:3] 종료
Thread-4[우선권:4] 종료
Thread-1[우선권:1] 종료
Thread-2[우선권:2] 종료



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Thread 죽이기

Programming/Java 2006. 10. 31. 19:13
스레드의 종료

run() 메서드의 종료는 스레드의 종료를 의미한다.
일반적으로 지속적인 작업을 하기 위해 run() 내에 while문을 포함하고 있으며, 이 while문이 끝나면 스레드가 종료되는 경우가 많다.
while문의 조건을 이용하여 스레드를 종료할 수 있다.

/**
while문의 조건을 이용한 스레드의 종료
**/
class TerminateThread extends Thread {
  // 스레드의 종료를 제어하는 플래그
  private boolean flag = false;
  public void run() {
    int count = 0;
    System.out.println( this.getName() + "시작" );
    while ( !flag ) {
      try {
       this.sleep( 100 );
      } catch( InterruptedException e ) {
      }
    }
    System.out.println( this.getName() + "종료" );
  }
  // flag가 true로 설정되면 while문이 끝난다.
  public void setFlag( boolean flag ) {
    this.flag = flag;
  }
}

public class TerminateThreadMain {
  public static void main( String args[] ) throws Exception {
    System.out.println( "작업시작" );
    TerminateThread a = new TerminateThread();
    TerminateThread b = new TerminateThread();
    TerminateThread c = new TerminateThread();
    a.start();
    b.start();
    c.start();
    int i;
    System.out.print( "종료할 스레드를 입력하시오! A, B, C, M?\n" );
    while ( true ) {
      // 문자를 입력받음
      i = System.in.read();
      if ( i == 'A' ) {
        a.setFlag( true );
      } else if ( i == 'B' ) {
        b.setFlag( true );
      } else if ( i == 'C' ) {
        c.setFlag( true );
      } else if ( i == 'M' ) {
        a.setFlag( true );
        b.setFlag( true );
        c.setFlag( true );
        System.out.println( "main종료" );
        break;
      }
    }
  }
}
// output
작업시작
종료할 스레드를 입력하시오! A, B, C, M?
Thread-1시작
Thread-2시작
Thread-3시작
M
main종료
Thread-1종료
Thread-2종료
Thread-3종료

/**
두개의 조건을 이용한 스레드의 종료 
**/
class ControlThread extends Thread {
  // 모든 스레드의 종료를 제어하는 플래그
  public static boolean all_exit = false;
  // 스레드의 종료를 제어하는 플래그
  private boolean flag = false;
  public void run() {
    int count = 0;
    System.out.println( this.getName() + "시작" );
    // flag 나 all_exit 둘 중 하나만 true이면 while문이 끝난다.
    while ( !flag && !all_exit ) {
      try {
        this.sleep( 100 );
      } catch( InterruptedException e ) {
      }
    }
    System.out.println( this.getName() + "종료" );
  }
  public void setFlag( boolean flag ) {
    this.flag = flag;
  }
}

public class ControlThreadMain {
  public static void main( String args[] ) throws Exception {
    System.out.println( "작업시작" );
    TerminateThread a = new TerminateThread();
    TerminateThread b = new TerminateThread();
    TerminateThread c = new TerminateThread();
    a.start();
    b.start();
    c.start();
    Thread.sleep( 100 );
    int i;
    System.out.print( "종료할 스레드를 입력하시오! A, B, C, M?\n" );
    while ( true ) {
      i = System.in.read();
      if ( i == 'A' ) {
        a.setFlag( true );
      } else if ( i == 'B' ) {
        b.setFlag( true );
      } else if ( i == 'C' ) {
        c.setFlag( true );
      } else if ( i == 'M' ) {
        // 모든 스레드를 종료한다.
        ControlThread.all_exit = true;
        System.out.println( "main종료" );
        break;
      }
    }
  }
}
// output
작업시작
종료할 스레드를 입력하시오! A, B, C, M?
Thread-1시작
Thread-2시작
Thread-3시작
A
Thread-1종료
B
Thread-2종료
C
Thread-3종료
M
main종료

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

NotRunnable Status

Programming/Java 2006. 10. 31. 18:59
NotRunnable 상태 만들기

하나의 스레드가 CPU를 독점하는 것을 막는 효과적인 방법이 있다.
sleep()을 이용해서 일정시간 동안만 대기시키는 방법(자동)
wait()notify()를 이용해서 대기와 복귀를 제어하는 방법(수동)
sleep()을 사용할 때 의무적으로 InterruptedException 처리를 해주어야 한다.

♣ sleep()의 사용
try {
  Thread.sleep( 1000 );  //시간의 단위는 1/1000초
} catch( InterruptedException e ) {
  e.printStackTrace();
}

/**
main()에서의 Thread.sleep()
**/
public class NotRunnableMain {
  public static void main( String[] args ) {
    long current = System.currentTimeMillis();
    System.out.println( "프로그램 시작" );
    try {
      Thread.sleep( 5000 );
    } catch( InterruptedException e ) {
      e.printStackTrace();
    }
    System.out.println( "프로그램 종료" );
    System.out.println( "시간: " + ( System.currentTimeMillis() - current ) );
  }
}
// output
프로그램 시작
프로그램 종료
시간: 5000

/**
스레드에서 sleep()의 사용
**/
import java.util.*;
class NotRunnableThread extends Thread {
  public void run() {
    int i = 0;
    while ( i < 10 ) {
      System.out.println( i + "회: " + System.currentTimeMillis() + "\t" );
      i = i + 1;
      try {
        this.sleep( 1000 );
      } catch( Exception e ) {
        System.out.println( e );
      }
    }
  }
}
public class NotRunnableThreadMain {
  public static void main( String[] args ) {
    NotRunnableThread s = new NotRunnableThread();
    s.start();
  }
}
// output
0회:1087996213815
1회:1087996214815
2회:1087996215815
3회:1087996216815
4회:1087996217815
5회:1087996218815
6회:1087996219815
7회:1087996220815
8회:1087996221815
9회:1087996222815



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Thread Status

Programming/Java 2006. 10. 31. 18:47
Thread Status

스레드를 만들고 시작시키는 것보다 스레드를 제어하는 것이 더 중요하다.
스레드를 제대로 제어하려면 먼저 스레드의 상태부터 알아야 한다.

♣ 스레드의 상태
  • 시작 상태(Start 상태)
    제일 먼저 스레드를 만든 후 start()를 호출했을 때 Start 상태가 된다.
    그리고 바로 Runnable 상태로 진입한다.
  • 동작할 수 있는 상태(Runnable 상태)
    스레드가 실행되면 일반적으로 Runnable 상태가 된다.
    Runnable 상태의 스레드는 여러 개 존재할 수 있다.
    Runnable 상태에 있는 스레드들끼리 번갈아 가면서 Run 상태가 된다.
  • 동작 상태(Run 상태)
    한순간에 단 하나의 스레드만이 Run 상태가 된다.
    Runnable 상태에서 CPU의 제어권을 할당받는 순간 Run 상태가 된다.
    작업을 마치면 Runnable 상태로 돌아와서 다음 순서를 기다린다.
    Run 상태가 될 때 스레드는 작업을 진행할 수 있다.
  • 대기 상태(NotRunnable 상태)
    NotRunnable 상태는 Run 상태로 진입할 수 없지만 Dead 상태는 아닌 대기 상태이다.
    (sleep(), wait(), notify() 메소드들을 사용하여 제어)
  • 종료 상태(Dead 상태)
    모든 작업을 완료하면 Dead 상태가 되고, 스레드는 자동으로 소멸하게 된다.
    run() 메소드의 종료는 스레드의 종료를 의미한다.



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,