Java/Java 인강

Java 인강 필기 13

code2772 2022. 10. 2. 11:05
728x90
반응형
(22.8.7)

# 43강 스레드2

​

- 스레드 우선수위 - 스레드는 시분할 방식으로 CPU의 시간을 분배하여 실행하지만

사용자가 직접 스레드의 우선순위를 지정해서 특정 스레드에 더 많은 실행시간 부여 가능

​

- 스레드 라이프사이클 - 스레드는 현재 상태에 따라 네 가지 상태로 분류할 수 있으며,

상태가 변화하는 주기를 Life Cycle 이라고 한다

​

- < 스레드 상태 >

​

- new -

스레드가 키워드 new를 통해서 인스턴스 화된 상태

Runnable이 될 수 있는 상태이며 아직 대기열에 올라가지 못한 상태

- Runnable -

start( ) 메서드가 호출되면 new 상태에서 Runnable 상태가 된다.

Runnable 상태가 되면 실행할 수 있는 상태로 대기하게 되며 스케줄러에 의해

선택되면 run( )메서드를 바로 수행

Blocked 실행 중인 스레드가 sleep( ), join( ) 메서드를 호출하게 되면, Blocked 상태가 된다.

- Blocked - 상태가 되면 스케줄러에 의해서 선택받을 수 없다.

- Dead - run( )메서드의 실행을 모두 완료하게 되면 스레드는 Dead 상태가 된다.

할당받은 메모리와 정보 모두 삭제된다

​

- sleep( )

: 스레드를 지정한 시간 동안 block 상태로 만든다

시간은 1000분의 1초 까지 지정할 수 있으며, 지정된 시간이 지나면 다시 runnable (실행 가능한)상태로 돌아간다

​

package day43;

​

public class Sleep2 {

​

public static void main(String[] args) {

SleepThread t= new SleepThread();

t.start();

}

}

​

class SleepThread extends Thread {

public void run() {

System.out.println("카운트 다운 5초");

for(int i=5;i>=0;i--) {

System.out.println(i);

if(i!=0) {

try{

Thread.sleep(1000); //1초동안 스레드 block

}

catch(InterruptedException e) {

System.out.println(e.toString());

}

}

}

System.out.println("종료");

}

}

​

​

​

​

​

- yield( )

: 자신의 시간을 양보하는 메서드.

스레드가 작업을 수행하던 중 yield( )를 만나면, 자신에게 할당된 시간을 다음 차례 스레드에게 양도

​

package day43;

//★

public class Yield1 {

​

public static void main(String[] args) {

MyThread6 s1= new MyThread6();

MyThread7 s2= new MyThread7();

​

Thread t1=new Thread(s1);

Thread t2=new Thread(s2);

​

t1.start();

t2

.start();

}

}

class MyThread6 implements Runnable{

@Override

public void run() {

for(int i=0;i<30;i++) {

System.out.print("★");

Thread.yield(); //자신에게 주어진 시간 양보

}

}

}

class MyThread7 implements Runnable{

@Override

public void run() {

for(int i=0;i<30;i++) {

System.out.print("☆");

}

}

​

}

​

​

​

​

- join( ) : 특정한 스레드가 작업을 먼저 수행할때 사용 실행 순서를 지켜야 하는 스레드들을 제어한다

​

package day43;

​

public class Join1 {

​

public static void main(String[] args) {

MyThread8 s1 = new MyThread8();

MyThread9 s2 = new MyThread9();

​

Thread t1 = new Thread(s1);

Thread t2 = new Thread(s2);

t1.start();

​

try {

t1.join();// t1를 제외한 다른 스레드 (lock), t1이 완료될때까지 기다림

} catch (InterruptedException e) {

System.out.println(e.toString());

}

t2.start();

try {

t2.join();// t2를 제외한 다른 스레드 (lock), t2이 완료될때까지 기다림

} catch (InterruptedException e) {

System.out.println(e.toString());

}

for(int i=0;i<10;i++) {

System.out.println("main : "+i);

}

}

}

​

class MyThread8 implements Runnable {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

System.out.println("t1 : " + i);

}

System.out.println("<<t1 완료>>");

}

}

​

class MyThread9 implements Runnable {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

System.out.println("t2 : " + i);

}

System.out.println("<<t2 완료>>");

}

}

​

​

# 44강 스레드3

​

- 스레드의 동기화

: 멀티 스레드로 작업 시, 스레드 간 작업이 서로 간섭이 되지 않도록 하는 것

멀티 스레드의 문제점?

멀티 스레드 기법은 자원을 공유하는데, 이 때 동시에 같은 자원을 처리한다면,

자원 값이 실제 처리 해야 하는 작업보다 더 많은 작업이 발생할 수 있다.

​

​

- wait( ) 와 notify( )

스레드를 대기시키는 wait( )메서드와 대기중인 스레드를 깨우는 notify( )메서드를

통한 스레드 제어 알아보기

​

​
반응형

'Java > Java 인강' 카테고리의 다른 글

Java 인강 필기 15  (0) 2022.10.02
Java 인강 필기 14  (0) 2022.10.02
Java 인강 필기 12  (1) 2022.10.02
Java 인강 필기 11  (0) 2022.10.02
Java 인강 필기 10  (1) 2022.10.02