프로세스 : 실행중인 프로그램
프로그램이 실행중인 상태 

운영체제가 프로그램의 명령어들이 실행될 수있는환경을 만든다. 메모리를 구성해주고
데이터를 꺼내서 실행을 시킨다. 

쓰레드 : 프로세스 내에서 실제 작업을 수행
         프로그램이 실행되는 흐름
         명렁어들이 순서대로 쭉 나열하고 있는 형식
         모든 프로세스는 하나 이상의 쓰레드를 가지고 있다.

싱글쓰레드 : 쓰레드가 1개인 프로세스
멀티쓰레드 : 쓰레드가 여러개 있는것.

멀티태스킹(멀티 프로세스, 멀티 쓰레드가 포함됨) : 동시에 수행하는 것

멀티프로세스 : 컴퓨터에 여러 프로그램이 동시에 수행중임
멀티쓰레드 : 하나의 프로그램 안에서 동시에 여러 작업을 할수 있는 것.

쓰레드가 많이 쓰이는 프로그램 : 게임

멀티프로세스는 새로운 프로세스를 계속 만들어야하고.. 자원을 많이쓰게된다.  

대부분 프로그램들이 멀티쓰레드를 사용한다.

멀티쓰레드의 장단점
장점 : 자원을 보다 효율적으로 사용할 수 있다.
       사용자에 대한 응답성이 향상된다. = 일을 시킬때 처리시간이 빨라진다.
       작업이 분리되어 코드가 간결해진다.

단점 : 동기화에 주의해야한다.
       동기화.. 작업 => 은행에서 출금하는 프로그램이 있을때
       교착상태 : 동기화 잘 못했을 때.. 다른작업을 수행해야하는데 락이 걸려이었어서 계속 대기중
       => 프로그램이 멈춘것 처럼 보인다.
       쓰레드가 골고루 실행되게 해야한다.
       고려해야할 사항이 많아진다.

쓰레드의 구현과 실행
: 자바에서는 쓰레드를 처리하기 위해 2가지 방법이 있다.
1) 쓰레드 클래스를 상속받는다.
2) Runnable 인터페이스를 구현한 클래스를 만들어서 작동시킨다.
=> 둘다 공통적으로 run()메서드를 오버라이딩(재정의)한다.

 

운영체제에서 보면 자바도 프로세스중 하나이다.

자바는 JVM만 있다면 어떤 운영체제에서도 동작한다.

 

프로세스 : 프로그램이 실행되서 돌아가고 있는 상태. 컴퓨터가 어떤 일을 실행하고 있는 상태

 

운영체제는 여러개의 프로그램의 프로세스를 돌리고 있다.

 

한 프로세스 내에서도 여러 갈래의 작업들이 진행되는 것.

여기서 갈래가 쓰레드이다.


 

프로세스 : 메모리에 올라가서 cpu가 처리중인 프로그램

 

작업관리자 창에서 현재 진행중인 프로그램을 볼 수 있다.

프로세스가 몇개 동작중이다.

쓰레드 : 쓰레드라는 단위로 처리중이다. 

main { 메인메서드의 처음부터 끝까지 동작 }

 

멀티 쓰레딩 : 하나의 프로그램이 여러개의 쓰레드를 가지고 동작을 시킬 수 있음.

쓰레드 a,b,c,d 가 있을 때 cpu가 싱글 쓰레딩 방식만 처리한다면

첫번째 a.쓰레드를 시작시켜서 a쓰레드를 다 처리할때까지는 bcd를 대기시킨다.

 

 

멀티 쓰레딩 방법  

- 코어가 많으면 쓰레드를 여러개 동작시킬때 좀더 효율적인 운영이 가능하다.

- 쓰레드가 여러개가 있을 때 이 프로그램 하나를 프로세스로 동작시킨다면 

 cpu가 a쓰레드 내용 1,2,3 번 정도 실행하고 다른 쓰레드들을 부분적으로 실행하고 돌아와서 다시 작업하고

왔다갔다 하면서 처리 = 동시에 처리하는 것 처럼 보인다.

 

하나의 cpu는 하나의 명령만 처리하는게 기본이다. 하지만 cpu는 그것을 돌아다니면서 실행하는 것

그게 너무 빨라서 동시에 처리되는것 처럼 보인다.

 

하나의 프로세스가 1개 이상의 쓰레드를 가질 수 있다.

 

멀티쓰레딩의 개념을 활용하면 메인이 시작되서 끝날 때까지 하는 작업과 동시에 다른 작업도 같이 수행되게 만들 수 있다.

 

1. 특정기능을 가지는 클래스에 대해서 쓰레드를 상속해서 만든다.

2. run( )이라는 메서드를 오버라이딩 한다. => 추가 작업 쓰레드

    메인쓰레드와 동시에 같이 작업할수 있는애

3. 쓰레드 객체 생성

4. 해당 쓰레드의 run( )을 호출하는 것이 아니라 start( )라는 메서드를 호출한다.

   => 새로운 쓰레드로 해당 클래스가 가지고 있는 run( )메서드를 수행시킨다.

5. 실행하면 메인이 실행하는 중에 조금씩 다른 쓰레드작업이 실행됨

 

Runnable 인터페이스

이 쓰레드가  어떤 다른 클래스를 상속하고 있는거라면 

쓰레드 b는 Runnable을 구현했기 때문에  start라는 메서드가 없다. => 쓰레드 그냥 생성(new Thread)

 => 생성자에 Runnable을 구현한 객체를 전달해 주면 그 객체에 정의되어 있는 run이 동작할 수 있다.

 

자바에서  멀티 쓰레드가 필요하다면 Thread 클래스를 상속(extends)하여 run()을 재정의하거나 Runnable 인터페이스를 구현(implements)해서 run()을 재정의한 다음에 / 결과적으로 쓰레드 객체가 갖고있는 쓰래드 클래스에 정의된 start()를 호출하면 각각의 run()메서드가 동작 할 때 새로운 쓰레드로 진행한다.

=> 쓰레드 상태, 데몬 쓰레드, 웨이트wait, join 등 쓰레드 들에 대한  ,관계가 있음

    우선순위 개념(priority), 싱크로 나이즈(동기화) 개념, 교착상태

 

쓰레드를 많이 사용하는 프로그램 = 웹서핑하면서 웹페이지에서 파일 다운로드 할 때

 


예제) Ex13_1

1) 쓰레드 클래스 작성

//1. 쓰레드 클래스를 상속해서 쓰레드 구현
class ThreadEx1_1 extends Thread{
	public void run() {
		//run() { : 쓰레드가 수행할 작업을 작성  }
		for (int i = 0; i < 500; i++) {
			//getName() = 쓰레드 이름/조상인 Thread가 가지고 있는 메서드
//			System.out.println(getName());
			System.out.print(0);
		}
	}
	
}
//2. Runnable인터페이스를 구현해서 쓰레드를 구현
class ThreadEx1_2 implements Runnable {

	@Override
	public void run() {
		//run() { : 쓰레드가 수행할 작업을 작성  }
		for (int i = 0; i < 500; i++) {
			//Thread.currentThread() : 현재 실행중인 Thread를 반환
//			System.out.println(Thread.currentThread().getName());
			System.out.print(1);
			//쓰레드를 상속받지 않아서 Thread.currentThread()를 써줘야지
			//Thread.currentThread()에 접근할 수 있다.
		}
	}
	
}

// 두가지 방법 다 run( )을 작성한다.

 

2) 메인 메서드 실행

 - 쓰레드의 객체 생성

   Ex1-1(Thread상속) 은 그냥 객체 생성

   Ex1-2 (Runnable 구현)은 생성자 뭐 만들어서 쓰레드에 넣어준다...

public class Ex13_1 {
	//쓰레드
	public static void main(String[] args) {
		
		ThreadEx1_1 t1 = new ThreadEx1_1();
		
		Runnable r = new ThreadEx1_2();
		Thread t2 = new Thread(r);//생성자 Thread(Runnable target)
		
		t1.start();
		t2.start();
		
/* 
실행결과
쓰레드의 이름 출력
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
*/
		
		
	}

}

 

0과 1이 섞여서 나온다.

 


▶ 쓰레드를 사용안하고 그냥 메인메서드에서 for문 돌린 경우

public class Ex13_1 {
	public static void main(String[] args) {
		ThreadEx1_1 t1 = new ThreadEx1_1();
		
		Runnable r = new ThreadEx1_2();
		Thread t2 = new Thread(r);//생성자 Thread(Runnable target)

		// 쓰레드를 사용안하고 메인메서드에서 실행할 경우
		for (int i = 0; i < 500; i++) {
			System.out.print(0);
		}
		
		for (int i = 0; i < 500; i++) {
			System.out.print(1);
		}
	}
}

 

0과 1이 섞이지 않고 차례대로 실행된다.


 

메인메서드의 쓰레드가 종료되어도 

다른 쓰레드가 실행중이면 프로그램은 종료되지 않는다.

 

 

▶ 싱글 쓰레드

 

public class Ex13_2 {
	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		
		for (int i = 0; i < 300; i++) {
			System.out.printf("%s", new String("-"));
			
		}
		System.out.println("소요시간 1 : " + (System.currentTimeMillis() - startTime));
		
		for (int i = 0; i < 300; i++) {
			System.out.printf("%s", new String("|"));
			
		}
		System.out.println("소요시간 2 : " + (System.currentTimeMillis() - startTime));
	}	

}

 

멀티쓰레드로 작성하면

입력하는 작업으로 작업중지 상태여도 다른 작업 수행가능하다.

예제) 13_5

public class Ex13_5 {
//멀티쓰레드
	public static void main(String[] args) {
		ThreadEx5_1 th1 = new ThreadEx5_1();
		th1.start();
		
		String input = JOptionPane.showInputDialog("아무값이나 입력");
		System.out.println("입력하신 값은 " + input + "입니다.");
	}

}

class ThreadEx5_1 extends Thread{
	public void run() {
		for (int i = 10; i > 0; i--) {	
			System.out.println(i);
			try {
				sleep(1000);
			} catch (Exception e) {
			}
		}
	}
}

 

쓰레드의 우선순위는 크게 기대하지 말자(희망사항임)

 


데몬쓰레드(보조역할)

 

메인-일반쓰레드가 종료되면 프로그램이 종료된다.

 

'고급JAVA' 카테고리의 다른 글

쓰레드 공부-03 : 쓰레드의 실행제어  (0) 2022.12.27
쓰레드 공부-02  (1) 2022.12.26
[JAVA] Collection - Properties  (0) 2022.12.22
[JAVA] 가변형인수 Varargs  (0) 2022.12.22
[JAVA] Map  (1) 2022.12.21

+ Recent posts