JAVA3_01_프로세스와 쓰레드

charl hi·2021년 9월 23일
0

JAVA3

목록 보기
1/9

프로세스와 쓰레드

정의

  1. 프로세스
  • 실행 중인 프로그램.
  • 자원(resources : 메모리, CPU..)과 쓰레드로 구성
  1. 쓰레드
  • 프로세스 내에서 실제 작업을 수행한다.
  • 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.

-> 프로세스가 공장이라면 쓰레드는 일꾼!


구분

  1. 싱글 쓰레드 프로세스
  • = 자원 + 쓰레드
  1. 멀티 쓰레드 프로세스
  • = 자원 + 쓰레드+쓰레드+쓰레드.....쓰레드

링크텍스트



멀티쓰레드의 장단점

  • 대부분의 프로그램이 멀티쓰레드로 작성되어 있다.

장점

  1. 시스템 자원을 보다 효율적으로 사용할 수 있다.
  2. 응답성 향상
  3. 코드 간결
    ...

단점

  1. 동기화에 주의해야 한다.
  2. 교착상태(dead-lock)/기아상태가 발생하지 않도록 주의해야 한다.
  3. 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다.
  • 프로그래밍할 때 고려해야 할 사항들이 많다.


쓰레드 생성자

📢📢📢주의

  • ✨✨✨ThreadGroup이 있다!!!
  • 없으면 ✨✨main쓰레드그룹!!!!

1. Thread()

Thread()

  • 가장 일반적인 형태의 생성자
  • 👀👀👀이 생성자를 이용하면 Thread의 이름은 'Thread-' +n 의 형태가 된다????????

2. Thread(Runnable r)

Thread(Runnable r)

  • Runnable(구현한)객체를 이용해서 Thread객체를 생성할 수 있는 생성자

3. Thread(Runnable r, String name)

Thread(Runnable r, String name)

  • Runnable(구현한)객체를 이용해서 Thread객체를 생성할 수 있는 생성자
  • 쓰레드의 이름을 지정할 수 있는 생성자

4. Thread(String name)

Thread(String name)

  • 쓰레드의 이름을 지정하면서 Thread객체를 생성할 수 있는 생성자

출처



쓰레드 구현과 실행

1. Thread 클래스 상속

class Mythread extends Thread{
	public void run() {	
    //Thread클래스의 run() 오버라이딩
    /* 작업내용 */
}
MyThread t1 = new MyThread();	//쓰레드 생성
t1.start();		//쓰레드 실행

2. Runnable 인터페이스 구현

class MyThread2 implements Runnable {
	public void run() {
    //Runnable인터페이스의 추상메소드 run() 구현
    /* 작업내용 */
}
Runnable r = new MyThread2();
Thread t2 = new Thread(r);	//Thread(Runnable r)
//Thread t2 = new Thread(new MyThread2()); <<줄인 것
t2.start();

이게 더 나은 방법!



싱글쓰레드와 멀티쓰레드의 차이

ex13_01


public class Ex13_01 {

	public static void main(String[] args) {
		//1. Thread 상속 방법
		Threadex1 t1 = new Threadex1();
		
		
		//2. Runnable 구현 방법
		Runnable r = new Threadex2();
		Thread t2 = new Thread(r);
		//줄이면 : Thread t2 = new Thread(new Threadex2());
		
		t1.start();
		t2.start();

	}

}

class Threadex1 extends Thread{
	public void run() {
		for(int i=0; i<20; i++){
			System.out.print(this.getName());	//thread의 이름 반환
			//조상인 Thread클래스의 메소드. this 생략 가능
		}
	}
}

class Threadex2 implements Runnable{
	public void run() {
		for(int i=0; i<20; i++) {
			System.out.print(Thread.currentThread().getName());
			//깊게 생각말고 이렇게 호출한다는 점을 기억하면 됨
		}
	}
}

Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-0Thread-0Thread-0Thread-0Thread-0

멀티쓰레드

  • 0 과 1 이 뒤섞인 걸 알 수 있다.
  • 실행할 때마다 다른 방식으로 뒤섞인다.


public class Ex13_01 {

	public static void main(String[] args) {
		//1. Thread 상속 방법
		Threadex1 t1 = new Threadex1();
		
		
		//2. Runnable 구현 방법
		Runnable r = new Threadex2();
		Thread t2 = new Thread(r);
		//줄이면 : Thread t2 = new Thread(new Threadex2());
		
//		t1.start();
//		t2.start();
		
		for(int i=0; i<20; i++){
			System.out.print(0);	//thread의 이름 반환
			//조상인 Thread클래스의 메소드. this 생략 가능
		}
		
		for(int i=0; i<20; i++) {
			System.out.print(1);
			//깊게 생각말고 이렇게 호출한다는 점을 기억하면 됨
		}

	}

}

0000000000000000000011111111111111111111

싱글쓰레드

  • 하나가 다 끝날 때까지 나머지는 기다린다.


합치면?? ㅎㅎ


public class Ex13_01 {

	public static void main(String[] args) {
		//1. Thread 상속 방법
		Threadex1 t1 = new Threadex1();
		
		
		//2. Runnable 구현 방법
		Runnable r = new Threadex2();
		Thread t2 = new Thread(r);
		//줄이면 : Thread t2 = new Thread(new Threadex2());
		
		t1.start();
		t2.start();
		
		for(int i=0; i<20; i++){
			System.out.print(0);	//thread의 이름 반환
			//조상인 Thread클래스의 메소드. this 생략 가능
		}
		
		for(int i=0; i<20; i++) {
			System.out.print(1);
			//깊게 생각말고 이렇게 호출한다는 점을 기억하면 됨
		}

	}

}

class Threadex1 extends Thread{
	public void run() {
		for(int i=0; i<20; i++){
			System.out.print(this.getName());	//thread의 이름 반환
			//조상인 Thread클래스의 메소드. this 생략 가능
		}
	}
}

class Threadex2 implements Runnable{
	public void run() {
		for(int i=0; i<20; i++) {
			System.out.print(Thread.currentThread().getName());
			//깊게 생각말고 이렇게 호출한다는 점을 기억하면 됨
		}
	}
}

Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0Thread-0000000000Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-1Thread-10000000000011111111111111111111

요렇게 뒤섞임!



쓰레드의 실행

  • 쓰레드를 생성한 후 -> start()를 호출해야 쓰레드가 작업을 시작한다.

  • BUT ✨start()했다고 바로 쓰레드가 실행되지 않는다.

  • OS 스케줄러실행순서를 결정한다. : OS에 종속적인 모습

✨✨start()의 역할

👀👀왜 run()을 구현해놓고 start()를 호출할까?

  • start() :
    ① ✨✨✨새로운 호출스택을 생성
    ② 그 스택에 run() 호출 -> start() 종료
    ③ ✨✨main() / run() 서로 독립적으로 작업수행 : 멀티쓰레드




Ref

0개의 댓글