java thread 실습해보기

java로 쓰레드에 대하여 잠시 알아보겠습니다.

정의

하나의 프로그램이 처리되면서 동작하는 것이 프로세스이며, 그 프로세스가 여러개로 나누어져 처리하는 것이 쓰레드입니다.

여러개의 쓰레드를 모아서 멀티 쓰레드로 작업을 하면 시간을 절약합니다.

java는 멀티 쓰레드를 지원합니다.

구현 방식

  • runnalbe 인터페이스 구현을 통하여 run 메소드 구현
public class Main {

	public static void main(String[] args) {
		Itest test = new Itest();
		Thread test_thread = new Thread(test,"first");

		test_thread.start();
		System.out.println(Thread.currentThread().getName());
	}

}

새로운 객체를 만들어서 쓰레드에 부여해줍니다.

그리고 start하여 시동을 겁니다.

마지막으로 메인 쓰레드의 이름을 출력하게합니다.

public class Itest implements Runnable {
	
	int sum = 0;

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName());
		System.out.println("test_thread");
		
		for (int i = 0; i < 10; i++) {
			if(Thread.currentThread().getName()=="first")
				sum++;
			System.out.println(i+" "+sum);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

run메소드를 구현하면서 이 쓰레드의 이름을 출력하고, for문을 반복합니다.

Thread.sleep으로 쓰레드를 잠시 쉬게합니다.

  • Thread 메소드를 상속받아서 run 메소드를 구현
public class Main {

	public static void main(String[] args) {
		ctest test = new ctest();
		
		test.start();
		System.out.println(Thread.currentThread().getName());
	}

}

객체를 만들어서 시작합니다.

그리고 메인 쓰레드의 이름을 출력합니다.

public class ctest extends Thread{
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName());
		System.out.println("test_thread");
		
		for (int i = 0; i < 10; i++) {
			System.out.println(++i);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		}
	}

Thread를 상속받아서 구현합니다.

이 역시 run메소드를 구현하는 것이며, 현재 쓰레드 이름을 출력한 뒤 for문을 반복하게 됩니다.

멀티 쓰레드

  • 객체 한개에 n개의 쓰레드를 동작합니다.
public class Main {

	public static void main(String[] args) {
		Itest test = new Itest();
		Thread test_thread = new Thread(test,"first");
		Thread test_thread2 = new Thread(test,"second");
		test_thread.start();
		test_thread2.start();
		System.out.println(Thread.currentThread().getName());
	}

}
  • 객체 한개에 한개의 쓰레드를 동작합니다.
public class Main {

	public static void main(String[] args) {
		Itest test = new Itest();
		Itest test2 = new Itest();
		Thread test_thread = new Thread(test,"first");
		Thread test_thread2 = new Thread(test2,"second");
		test_thread.start();
		test_thread2.start();
		System.out.println(Thread.currentThread().getName());
	}

}

특징

main 쓰레드부터 시작하고, 직접 구현한 쓰레드를 시작합니다.

그리고, 멀티 쓰레드에서는 누가 먼저 시작할지 모릅니다.

클래스 변수

객체 하나를 쓰레드가 서로 사용하면 값을 같이 공유합니다.

  • 1 객체 n 쓰레드 : 클래스에 있는 변수를 같이 사용함.

  • 1 객체 1 쓰레드 : 클래스에 있는 변수를 각자 사용함.

synchronized

먼저 수행되는 쓰레드의 모든 작업이 끝날때까지 다른 쓰레드를 기다리는 방식입니다.

public synchronized void run()

위와 같이 run 메소드에 synchronized를 부여하면 됩니다.

결과는 첫번째로 시작되게 된 쓰레드가 전부 연산하고 다음 쓰레드로 넘어가게 됩니다.

Written on January 24, 2018