-
스레드 기본(1)JAVA/in 기초 2014. 3. 5. 00:08728x90
프로세스와 스레드의 개념
프로세스(Process)
하나의 프로그램은 하나의 프로세스에 해당한다.
멀티태스킹(Multi-Taking)
프로세스의 경우 운영체제에서 자동으로 관리 해주다.
운영체제 차원의 프로세스 관리를 멀티 태스킹이라고 한다.
프로세스와 스레드(Thread)
하나의 프로세스 내에는 여러 개의 스레드가 존재 할 수 있다.
스레드란?
하나의 프로그램 내에서 실행되는 메소드
같은 순간에 두 개의 매소드가 동시에 실행되면서 두 개의 스레드가 동작 하는 것이다.
스레드 프로그램을 할 때 주의해야 할 사항
우선권(Priority) : 동시에 두개이상의 메소드가 실행되기 때문에 어느 메소드에게 작업할 권한을 많이 줄 것인지에 대해서 결정 하는 것.
동기화(Synchronization) : 하나의 자원을 상대로 순서대로 작업이 처리되는 것을 보장하는 기법.
스레드란?
시퀀셜(Sequential)하게 동작한다.
한 순간에 하나의 메소드가 동작하는 것을 이야기 한다.
스레드의 기본
한 순간에 두개의 메소드가 동시에 실행 되었을때 실행된 메소드 들을 스레드라고 한다.
스레드란
프로그램에서 독립적으로 실행되는 메소드
Runnable로 스레드 만들기
스레드에서 실행 되는 메소드를 만들기 위해서 Runnable 이라는 인터페이스를 상속 받아 run() 이라는 메소드를 구현 해야 한다.
public class ThreadMain{ public static void main(String[] args) { System.out.println("프로그램 시작"); Top t = new Top(); Thread thd = new Thread(t); thd.start(); System.out.println("프로그램 종료"); } } class Top implements Runnable { @Override public void run() { //작업 내역 for(int i=0; i<50; i++) System.out.print(i + "\t"); } }
두개의 스레드 만들기
Top t = new Top(); Thread thd1 = new Thread(t); Thread thd2 = new Thread(t); thd1.start(); thd2.start();
Thread 상속으로 스레드 만들기
Runnable 을 이용하지 않고 Thread를 바로 상속한 후 run()을 작성할 수 있다.
public class DerivedThreadMain { public static void main(String[] args) { System.out.println("프로그램 시작"); Thread thd1 = new DerivedThread(); thd1.start(); System.out.println("프로그램 종료"); } } class DerivedThread extends Thread { @Override public void run() { //작업 내역 for (int i = 0; i < 50; i++) System.out.print(i + "\t"); } }
Thread의 상속으로 구현하든, Runnable을 이용해서 구현하든, 스레드로써 동작하는 것은 같지만, Runnable으 인터페이스이고 Thread는 클래스라는 점을 감안해서 사용 해야 한다.
Runnable을 사용하는 이유
기본적으로 Thread 클래스를 상속하는 것이 훨씬 편한 방법 이다. 상속의 장점을 최대한 살릴 수 있는것이며, 부모 클래스인 Thread 클래스의 메서드를 마음대로 이용할 수 있다는 객체 지향 자체의 장점이기 때문이다.
하지만 굳이 Runnable 인터페이스를 사용하는 이유는 클래스가 다른 클래스를 미리 상속했기 때문이다. 자바는 단일 상속을 기본으로 하기 때문에 다른 클래스를 상속 했다면 Thread를 상속 할 수 없다.
public class RunFrameMain { public static void main(String[] args) { RunFrame r = new RunFrame(); r.setSize(300, 100); r.setVisible(true); Thread t = new Thread(r); t.start(); } } class RunFrame extends Frame implements Runnable { @Override public void run() { System.out.println("스레드 시작"); int i = 0; while (i < 20) { System.out.println(i + "\t"); this.setTitle("스레드 동작중 " + i++); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("스레드 종료"); } }
상위 예제처럼 창을 만들고 스레드를 동작 시키는 방법은 프로그램적으로 그렇게 세련되지 못한 기법이다. 프로그램은 동작하지만, 매끄러운 구문은 아니다.
public class RunnableFrameMain { public static void main(String[] args) { RunnableFrame r = new RunnableFrame(); r.setSize(300, 100); r.setVisible(true); } } class RunnableFrame extends Frame implements Runnable { public RunnableFrame() { new Thread(this).start(); } @Override public void run() { System.out.println("스레드 시작"); int i = 0; while (i < 20) { System.out.println(i + "\t"); this.setTitle("스레드 동작중 " + i++); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("스레드 종료"); } }
public class SoloFrameMain { public static void main(String[] args) { SoloFrame s = new SoloFrame(); s.setSize(300, 100); s.setVisible(true); } } class SoloFrame extends Frame { public SoloFrame() { SoloThread t = new SoloThread(this); t.start(); } } class SoloThread extends Thread { private Frame f = null; public SoloThread(Frame f) { this.f = f; } @Override public void run() { System.out.println("스레드 시작"); int i = 0; while (i < 20) { System.out.println(i + "\t"); f.setTitle("스레드 동작중 " + i++); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("스레드 종료"); } }
프로그램적인 기법이기 때문에 어느 것을 사용해도 상관 없지만 RunFrame 보다 RunnableFrame 방식이 더 일방적인 방식이다.
728x90'JAVA > in 기초' 카테고리의 다른 글
스레드 기본(2) (0) 2014.03.05 static 변수는 하나의 프로세스에서 하나의 값만 가진다. (0) 2014.03.05 가변 인수(Varargs) (0) 2014.02.23 Java에서의 상수와 enum(열거형) 사용 예제 및 설명 (0) 2014.02.23 Formatting 기능 (0) 2014.02.21