본문 바로가기

Java

자바 Thread

쓰레드 (Thread)란 뭘까?

  • process란? 지정되어 있는 프로그램이 실행되면 OS (운영체제)로 부터 메모리를 할당받아 프로세스 상태가 된다.
  • 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread이다.

쓰레드를 추가로 만들어서 사용하는 방법

1. 첫번째 방법은 Thread 클래스를 상속하여 만들 수 있다.

package useful.ch05;

/**
 * 쓰레드를 추가하는 방법 - 상속을 활용할 수 있다. 
 * Thread -> Runnable -> run()
 */
public class MyThread extends Thread {

	// 우리가 정의한 클래스에서 run() 메서드 재정의 할 수 있다.
	// 쓰레드를 사용할 때 알아야 하는 필수 개념 - 그냥 외우자!
	// 쓰레드가 가지고 있는 메서드 start() 를 호출 시키면 약속으로
	// run() 메서드가 호출되어 동작하게 만들어져 있다.
	@Override
	public void run() {

		// 우리가 동작 시키고자 하는 일을 정의해서 코드를 설계할 수 있다.
		// 임무 -> 반복문 200번을 수행해!

		for (int i = 0; i < 200; i++) {
			System.out.println(i + ", ");
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}// end of class
package useful.ch05;

public class MyThreadMainTest {

	// 기본적으로 메인 작업자 하나를 가지고 있다 <- 메인 쓰레드라 한다.
	public static void main(String[] args) {

		System.out.println(Thread.currentThread());

		// 필요하다면 추가 작업자를 사용할 수 있다.
		MyThread th1 = new MyThread();
		th1.start(); // start 가 호출되면 run() 메서드가 동작되게 약속되어 있다.
		System.out.println("--------------------------------------");

		// 필요하다면 추가 작업자를 더 만들 수 있다.
		MyThread th2 = new MyThread();
		th2.start();

	}// end of main

}// end of class
package useful.ch05;

// HOW, WHY
public class Worker extends Thread {

	private String name;

	public Worker(String name) {
		this.name = name;
	}

	// 약속된 부분 -> run() 메서드를 정의하면 된다.

	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println("worker : " + name + " : " + i);
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
package useful.ch05;

public class WorkerMainTest {

	// 메인 작업자
	public static void main(String[] args) {

		System.out.println("--------------- mian 쓰레드 시작 ---------------");
		System.out.println(Thread.currentThread());

		// 작업자 하나 만들어 내기
		Worker worker1 = new Worker("워커1"); // 생성은 메인 쓰레드가 했다.

		// 명령어를 통해서 워커1에게 너가 위임받은 일을 시작해
		worker1.start(); // 메인 쓰레드가 명령 내림

		System.out.println("--------------- main 쓰레드 종료 ---------------");

	}// end of main

}// end of class

쓰레드를 생성해서 쓰면 하나의 클래스로도 동시에 여러가지 동작을 수행할 수 있어서 시간 절약 효율적이다.

메인에서 코드를 적으면 하나 수행하고 끝내고 하는데 쓰레드를 만들어주면 내가 하나를 수행하고 있어도 다른 쓰레드가 일을 하고 있음

 

2. 두번째 방법은 Runnable 인터페이스 구현하여 만들 수 있다.

package useful.ch05;

/**
 * 쓰레드를 만드는 두번째 방법 Runnable 인터페이스를 활용하는 방법
 */
public class MyThread2 implements Runnable {

	// Thread 클래스에서 start 메서드가 호출되면
	// 동작하는 부분이라고 약속되어 있다.
	@Override
	public void run() {
		int i = 0;
		while (i < 10) {
			System.out.println("i : " + i);
			i++;
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
package useful.ch05;

public class MyThread2MainTest {

	// 메인 작업자
	public static void main(String[] args) {

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

		// 문제 MyThread2를 메모리에 올리고
		// 그 안에 정의된 run() 메서드를 호출 하시오.
		// 힌트 -> Thread 문서를 반드시 확인 하시오.

		MyThread2 myThread2 = new MyThread2();
		// myThread2.run(); // 메서드의 호출, 새로운 작업자 생성은 아니다.

		// 새로운 작업자를 생성해서 위임 시킬 때는 Thread 안에 있는 start() 메서드를 호출해야 된다.
		Thread thread1 = new Thread(myThread2);
		thread1.start();
		System.out.println("----- end main thread -----");

	}// end of main

}// end of class

쓰레드의 실행스 쓰레드 상태라는 개념을 알아보자.


쓰레드 ( Thread )란?

쓰레드는 프로세스 내에서 실제로 작업을 수행하는 단위이다. 모든 자바 프로그램은 메인 쓰레드에서 시작되며, 사용자는 추가적인 쓰레드를 생성할 수 있다. 각 쓰레드는 독립적으로 실행되며, 자신만의 호출 스택을 가진다. (각 쓰레드의 스택 영역은 서로 격리되어 있다.) 프로세스 내의 모든 쓰레드는 같은 Heap 메모리 공간과 다른 자원을 공유할 수 있다.

728x90

'Java' 카테고리의 다른 글

자료구조 개론 ( Data Structure )  (1) 2024.05.02
자바 Multi - Threading  (0) 2024.05.02
Exception ( 예외처리 )  (0) 2024.05.02
String, StringBuffer 클래스  (0) 2024.05.01
Object 클래스와 equals 메서드  (0) 2024.04.25