SEB_BE 19일차 - Effective2

subimm_·2022년 9월 16일
0

코드스테이츠

목록 보기
19/83
post-thumbnail

오늘의 학습목표

  • 스트림 문제
  • 스레드
  • 자바 가상 머신

📔 스레드

  • 프로세스 - 실행중인 애플리케이션
  • 프로세스 내에서 실행되는 소스 코드의 실행 흐름
  • 싱글 스레드 / 멀티 스레드

📖 메인 스레드

자바 애플리케이션에서 가장 먼저 실행되는 main메서드를 실행시키는 스레드
순차적으로 실행시키고, 코드가 끝나거나 return문을 만나면 실행 종료

📖 멀티 스레드

여러 스레드가 동시에 작업을 수행

📙 스레드의 생성과 실행

메인 스레드 외 별도의 작업 스레드 생성 실행

  • 첫번째 방법
    Runnable 인터페이스를 구현한 객체에서 run()을 구현하여 생성 실행
public class ThreadExample1 {
    public static void main(String[] args) {
    //Runnable 인터페이스를 구현한 객체 생성
    Runnable task1 = new ThreadTask1();
    //Runnable 구현 객체를 인자로 전달하면서 Thread 클래스를 인스턴스화하여 스레드 생성
    Thread thread1 = new Thread(task1)
    // Thread thread1 - new Thread(new ThreadTask1()); //한줄로 작성 가능
    thread1.start(); //작업 스레드 실행 
    }
}
// Runnable 인터페이스를 구현하는 클래스 생성
class ThreadTask1 implements Runnable {
    public void run() { //스레드가 수행할 작업 내용 작성
		for (int i = 0; i < 100; i++) {
            System.out.print("*");
    }
}
  • 두번째 방법
    Thread 클래스를 상속 받은 하위 클래스에서 run()을 구현하여 생성 실행
public class ThreadExample2 {
	public static void main(String[]args) {
    //Thread 클래스를 상속받은 클래스를 인스턴스화하여 스레드 생성
    //Thread 클래스를 직접 인스턴스화 하지 않음
    ThreadTask thread2 = new ThreadTask();
    //작업 스레드를 실행
    thread2.start();
    }
}
//Thread 클래스를 상속받는 클래스 생성
class ThreadTask2 extends Thread {
	public void run() { //스레드가 수행할 작업 내용 작성
    for (int i = 0; i <100; i++) {
    System.out.print("*");
    }
}
  • 익명 개체를 사용하여 스레드 생성 실행
  1. Runnable 익명 구현 객체를 활용
//익명 Runnable 구현 객체를 활용하여 스레드 생성
Thread thread1 = new Thread(new Runnable() {
	public void run() {
    	수행할 작업 내용
    }
}

2.Thread 익명 하위 객체를 활용

//익명 Thread 하위 객체를 활용한 스레드 생성
Thread thread2 = new Thread() {
	public void run() {
    수행할 작업 내용
 	}
}
  • 스레드 이름 조회 / 출력
    추가 생성한 스레드 기본 이름 Thread-n

  • getName() / setName()

Thread thread1 = new Thread(new Runnable() //익명 러너블 구현 객체로 스레드 생성
public void run() {
	System.out.printls("스레드 이름");
    }
};
thread1.start(); //스레드 실행
System.out.println(thread1.getName()); // 스레드 이름 조회
//출력 Thread-0
thread1.setName("Hello"); // 스레드 이름 변경
System.out.println(thread1.getName()) 
//출력 Hello
  • 실행중인 스레드의 주소값을 사용해야 하는 상황 currentThread()
//실행중인 스레드 안
System.out.println(Thread.currentThread().getName()); //현재 스레드의 이름 가져오기
  • getState() : 스레드의 현재 상태 출력

📔 스레드의 동기화

  • 두 스레드가 동일한 데이터를 공유할 때 문제가 발생
  • try { Thread.sleep(1000); } catch (Exception error) {}
    • Thread.sleep(1000);
      • 스레드를 일시 정지시키는 메서드 / 대기열에 있는 다른 스레드가 실행됨.
      • Thread.sleep() 메서드는 반드시 try-catch 문의 try 블럭에 작성해주어야함.
      • (1000) 1초동안 동작 멈추기
  • 문제 발생 예제 코드

  • 임계 영역 지정하지 않았을 때 오류 출력

  • 정상 출력

📖 스레드의 상태와 실행 제어

  • start() 스레드를 실행 대기 상태로 만들어 준다.

  • sleep(long milliSecond) : 스레드의 실행을 잠시 멈춤
    인자로 전달한 시간만큼 경과하거나 interrupt() 호출한 경우 다시 실행 대기로 복귀

  • intrerrupt() : 일시 중지 상태인 스레드를 실행 대기 상태로 복귀


회고

드디어 부트캠프 한달이 지나고 자바 파트가 끝났다. 너무 짧은 시간에 정신없이 지나가서 제대로 잘 배우고 이해한건지 걱정이 된다. 계속 복습하고 실습해보면서 익혀야 할 것 같다. 주말동안 객체지향개념부터 다시 봐야겠다. 다음주에는 섹션2 시작이다. 힘내자😃

profile
코린이의 공부 일지

0개의 댓글