멀티 스레드(작성중)

스레드란

그동안 작성한 프로그램을 모두 하나의 스레드로 이루어진 프로세스이다.

프로세스

멀티 태스킹

동시 실행 - 시분할 기법과 같은 다양한 기법을 이용하여 '동시 실행'하는 것과 같은 효과

스레드(Thread) - 프로세스 내의 작은 실행 단위

메인 스레드

Thread 클래스

상수

  • static int MAX_PRIORITY
  • static int MIN_PROIRITY
  • static int NORM_PRORITY

생성자

  • Thread()
  • Thread(String name)
  • Thread(Runnable target)
  • Thread(Runnable target, String name)
  • Thread(ThreadGroup group, Runnable target, String name)

메소드

  • void checkAccess()
  • static Thread currentThread()
  • String getName()
  • void setname(String name)
  • int getPriority()
  • void setPrority(int newPrority)
  • void interrup()
  • static boolean isInterupted()
  • boolean isAlive()
  • void join()
  • void join(long mills)
  • void start()
  • static void yield()
  • static void sleep(long millis)

java api 문서 참고 필요

스레드와 관련 있는 Object 클래스에 정의된 메소드

  • void wait()
  • void wait(long millis)
  • void notify()
  • void notifyAll()

스레드의 생성 방법

Thread 클래스를 이용하거나 Runnable 인터페이스를 이용하는 방법이 있는데
자바는 다중 상속을 지원하지 않으므로 다른 클래스의 상속을 받지 않는 경우 Thread 클래스를 상속 받아 스레드를 구현하고, 다른 클래스를 상속받으면서 스레드가 되게 하려면 Runnable 인터페이스를 구현하는 방법을 사용한다.

Thread 클래스를 이용하여 스레드 생성

class MyThread extends Thread {
    @Override
    public void run() { // Thread를 상속받고 run() 메소드를 구현
        System.out.println("스레드");
    }
}

public class MyThreadTest {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // start() 메소드를 호출하면 myThread 인스턴스의 run()이 실행
    }
}

run() 메소드를 직접 호출하기 않고 start() 메소드를 통해 간접적으로 호출하는 이유는 스레드의 실행이 시스템이 관리하는 멀티 태스킹과 연관리 있기 때문이다.

Runnable 인터페이스를 이용하여 스레드 생성

class MyThread2 implements Runnable {
    @Override
    public void run() {
        System.out.println("스레드");
    }
}

public class RunnableTest {
    public static void main(String[] args) {
        Thread runnableTest = new Thread(new MyThread2()); // MyThread2()의 객체를 매개변수로 전달
        runnableTest.start(); // start() 메소드를 호출하면 myThread 인스턴스의 run()이 실행

    }
}

<멀티 스레드 구현>

class MyThread3 extends Thread {
    public MyThread3(String mtName) {
        super(mtName);
    }
    @Override
    public void run() {
        super.run();
        for(int i=0; i<10; i++) {
            System.out.print(this.getName()+"_"+i+",");
        }
    }
}

public class MultiThreadTest {

    public static void main(String[] args) {
        MyThread3 mt1 = new MyThread3("mtd1");
        MyThread3 mt2 = new MyThread3("myd2");
        MyThread3 mt3 = new MyThread3("mtd3");

        mt1.start();
        mt2.start();
        mt3.start();
        System.out.println("main");
    }

}

<결과>
main
mtd1_0,mtd1_1,mtd1_2,mtd1_3,mtd1_4,mtd1_5,mtd1_6,mtd1_7,mtd1_8,mtd1_9,myd2_0,myd2_1,mtd3_0,myd2_2,mtd3_1,myd2_3,myd2_4,mtd3_2,myd2_5,mtd3_3,myd2_6,myd2_7,myd2_8,myd2_9,mtd3_4,mtd3_5,mtd3_6,mtd3_7,mtd3_8,mtd3_9,

  • 스레드는 정해진 실행 순서 없이 무작위로 실행되므로 결과가 매번 다를 수 있다.
  • main이 끝에 출력되지 않는다는 점도 알 수 있다.

스레드의 제어 방법

여러 개의 스레드를 동기화하는 방법

+ Recent posts