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 |