본문 바로가기

이론/알고리즘&자료구조&Java

[Java] Thread in java(간단 사용 예제)

 

Thread in java

Thread 클래스를 상속받는 방법

  • 쓰레드의 실행은 Thread.start() 메소드를 실행시킴으로써 할 수 있고, 이 때 쓰레드 클래스의 run()이 호출된다. 즉, run() 오버라이딩 메소드안에 수행할 작업을 구현해야한다.


public class ThreadTest extends Thread{
    int arg;

    public ThreadTest(int arg) {
        this.arg=arg;
    }
   
    @Override
    public void run() {//Thread.start()시 실행되는 함수,
        System.out.println("Thread Start: "+this.arg);
    
    try {
    
        Thread.sleep(1000);

    }catch(Exception e) {
        e.printStackTrace();
    }
    
    System.out.println("Thread end :" + this.arg);

  }
    
    public static void main(String[] args) {

    for(int i=0; i<10; i++)
    {
        ThreadTest th=new ThreadTest(i+1);
        th.start();
    }
    
        System.out.println("main end");
    
    }

}

Runnable 인터페이스를 구현하는 방법

  • Thread 클래스와 동일하게 run() 을 오버라이딩한다.

  • 쓰레드의 실행은 쓰레드 인스턴스에 구현 클래스를 인자로 넣음으로써 할 수 있다.


public class ThreadTest implements Runnable{

    int arg;

    public ThreadTest(int arg) {
        this.arg=arg;
    }
   
    @Override
    public void run() {//Thread.start()시 실행되는 함수,
        System.out.println("Thread Start: "+this.arg);

    try {

        Thread.sleep(1000);

    }catch(Exception e) {
        e.printStackTrace();
    }

    System.out.println("Thread end :" + this.arg);
    }

    public static void main(String[] args) {

        for(int i=0; i<10; i++)
        {
            ThreadTest th=new ThreadTest(i+1);
            new Thread(th).start();
        }    

       System.out.println("main end");

    }
}

위의 코드를 실행해보면 main메소드가 먼저 끝나는 것을 확인할 수 있다.

메인 메소드의 종료 메시지가 출력되는 것을, 쓰레드가 모두 종료된 이후로 조정하고 싶다면 Thread.join() 을 이용한다.

레퍼런스에 따르면

  • join(): Waits for this thread to die.

어마무시하군..!

join 메소드 활용 예제

import java.util.ArrayList;

public class ThreadTest implements Runnable{

    int arg;

    public ThreadTest(int arg) {
        this.arg=arg;
    }
   
    @Override
    public void run() {//Thread.start()시 실행되는 함수,
        System.out.println("Thread Start: "+this.arg);
        
    try {

        Thread.sleep(1000);
        
    }catch(Exception e) {
        e.printStackTrace();
    }

       System.out.println("Thread end :" + this.arg);
    }

    public static void main(String[] args) throws InterruptedException {
           ArrayList<Thread> threads = new ArrayList<Thread>();
    for(int i=0; i<10; i++)
   {
        Thread th=new Thread(new ThreadTest(i+1));
        threads.add(th);
        th.start();
    }
        
    for(int i=0; i<threads.size(); i++) {
        Thread th=threads.get(i);
        th.join();
    }

    System.out.println("main end");
    
    }
}