본문 바로가기
개발자/백엔드 웹 개발자 과정(국비)

2022년 12월 08일 _ 22회차 (Thread 스레드)

by 초응 2022. 12. 8.
프로그램이란?
사용자와 컴퓨터가 의사소통을 하면서 사용자가 요구하는 결과를 도출해내는 도구

 

Process : (cpu 아님), 운영체제 내에 실행 중인 프로그램 의미 (장치 X, 단위 O)

하나의 프로그램의 작업이 실행되는 단위를 Process라고 한다.
cpu는 한 번에 한 가지 일 밖에 못함.
Multi- Process :두 개 이상의 프로그램이 두 개 이상의 CPU에서 실행되는 것을 의미.
Multi-Tasking :하나의 CPU에서 여러 개의 프로그램이 실행되는 것처럼 보이는 것.

 [Thread (스레드)]
프로세스 내에서 실행되는 세부작업 단위.
ㄴ 웹에서는 많이 쓰는 기술은 아님. 직접 구현할 일은 없지만 모바일을 할 때는 스레드를 구현할 정도로는 할 줄 알아야 함.
시작 중간 끝을 가지고 있는 하나의 실행 작업 단위

Exception in thread "main": 시작 중간 끝을 정의할 수 있기 때문에 main도 스레드이다.


[Thread구현 방법]

1. Thread 상속받는 방법
(1) java.lang.Thread클래스를 상속받는 클래스 작성
(2) run() 메서드를 오버 라이딩하여 구현. (run==main이라고 인식해도 됨).
(3) main() 메서드에서 스레드를 상속받은 클래스의 객체를 생성
(4) 해당 스레드 객체의 start() 메서드 호출.

//주 클래스를 상속받고 있는 상태로 스레드 클래스를 상속받을 수 없다.

2.Runnable를 상속받는 방법(스레드는 아니지만 스레드로 인지 받기 위한)
(1) java.lang.Runnable 인터페이스를 상속받아 클래스 구현
(2) run() 메서드를 오버 라이딩하여 구현
(3) main()에서 Runnable로 구현한 클래스 객체 생성
(4) Thread 객체 생성하며 Runnable로 생성한 객체 넘겨줌.
(5) Thread 객체에서 start() 메서드를 호출.

****Thread 주요 메서드****
start() : 스레드 실행.
activeCount() : 현재 실행 중인 스레드 그룹 개수를 돌려준다.
currentThread() : 현재 실행 중인 스레드 객체를 돌려준다.
setName() : 해당 스레드에 이름을 작성한다.
getName() : 해당 스레드의 이름을 가져온다.
sleep() : 자기보다 낮은 순위의 스레드에게 실행 기회를 준다. (예외 상황)
yield() :우선순위가 같거나 높은 스레드에게 실행 기회를 준다. (강제성을 포함하지 않음(반영이 될 수도 안될 수도 있음. 우선순위 설정은 그저 추천사항에 불과. 예외처리)
join() :  호출한 스레드가 종료할 때까지 현재의 스레드를 기다린다. (강제성, 예외처리)
interrupt() : sleep()및 wait() 메서드가 수행 중 일 때, 이 메서드를 호출하면 interruptedException이 발생된다.
setPriority() : 우선순위를 지정한다.
getPriority(); 우선순위를 가져온다. 
package day22;
//						Thread.currentThread();
//						Thread[Thread-0,5,main]		
//						(스레드 이름-인덱스번호 , 스레드의 우선순위 (기본값 5),누구로부터 파생되었는지)

//다중 스레드 만들기.**Thread구현방법1**
class ThreadA extends Thread{
	
	@Override
	public void run() {//run == main과 같은 역할을 해줌.
		
		Thread temp = Thread.currentThread();
		System.out.println("ThreadA.temp="+temp);
		
		System.out.println("**ThreadA의 시작**");

		for(int i=1;i<=10;i++) {
			System.out.println("**ThreadA의 값:"+i+"**");
		}
		System.out.println("**ThreadA의 끝**");
	}
}

//주클래스를 상속받고 있는 상태로 쓰레드 클래스를 상속받을 수 없다.**Thread구현방법2**
class ThreadB implements Runnable{
	
	@Override
	public void run() {
		Thread temp = Thread.currentThread();
		System.out.println("ThreadB.temp="+temp);
		
		System.out.println("@@ThreadB의 시작@@");
		
		for(int i=1;i<=10;i++) {
			System.out.println("@@ThreadB의 값:"+i+"@@");
		}
		System.out.println("@@ThreadB의 끝@@");
	}
}
public class ThreadTest1 {

	public static void main(String[] args) {//메인도 쓰레드다.
		
		//싱글(단일) 스레드
		//스레드 :시작 중간 끝을 가지고 있는 하나의 실행작업 단위
		
		ThreadA ta = new ThreadA();
		
//		ta.run();//메소드의 호출로 인식함. //싱글쓰레드에 run호출한거임.
		
		ta.start(); //스레드 하나를 더 활성화시키고 메모리에 등록. 멀티스레드.//순서 랜덤으로 나옴.(cpu점유율에 따라 다름)
		//다중스레드(멀티스레드)
		
		ThreadB tb = new ThreadB();
//		tb.stat(); //  안됨.Runnable의 주기능을 가지고 있지만 스레드가 아니기때문에. 
		Thread tb2 = new Thread(tb);
		tb2.start();
		
		tb2.setName("secondThread"); //스레드 이름 변경.
		
		ta.setPriority(10); //1~10 ==	tb2.setPriority(Thread.MAX_PRIORITY);
		tb2.setPriority(Thread.MIN_PRIORITY);//==setPriority(1);
		
		int count =Thread.activeCount();
		System.out.println("현재 돌고 있는 스레드 수:"+count);
		
		//메인이 가지고 있는 객체를 다루고 싶을때.
		Thread temp =Thread.currentThread();
		System.out.println("temp="+temp); //
		
//		Thread.yield();// 강제성을 포함하고 있지 않음.
		
		try {//건다라고 표현. join은 강제성을 포함하고 있음. join은 잠시 쉼.그래서 예외 상황이 생길 수 있음.
			ta.join();
			tb2.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 

		System.out.println("==main의 시작==");

		for(int i=1;i<=10;i++) {
			System.out.println("==main의 값:"+i+"==");
		}
		
		System.out.println("==main의 끝==");
	}
}

 


Calendar 클래스

-Data클래스 대신 사용하게 된 날짜 제공 추상 클래스. (추상 클래스는 new 해서 객체 생성 안됨)
Claendar now = Calendar.getlnstance();

객체를 할당받는 방법(면접 팁)
1. 프로토 타입 방식 :  내가 필요할 때마다 객체를 만들어서 할당받는 방식. (new)
2. 싱글턴 : 객체가 이미 만들어져 있고 만들어있는 것을 제공받는 형식.(재활용하는 방식)
ㄴ Calendar가 싱글턴 방식의 대표. 


// 싱글턴은 getInstance() 메서드를 호출한다.


데이터베이스 3대 자료형 : 숫자 , 문자, 날짜 데이터

package day22;
import java.util.*;
public class DataTest {

	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance();
		
		int y = now.get(Calendar.YEAR);
		int m = now.get(Calendar.MONTH)+1;
		int d = now.get(Calendar.DATE);
		System.out.println(y+"년"+m+"월"+d+"일");

	}

}