재밌고 어려운 IT를 이해해보자~!
쓰레드 본문
스레드란 여러가지 작업을 동시에 하기위해 있는 클래스이며 extends Thread로 상속받아 사용한거나
Runnable사용
프로그램은 파일이 존재하지만 아직 메모리에 올라가 있지 않은 상태, 즉 실행되지 않은 코드의
집합을 말한다. 프로그램을 실행하는 순간 메모리에 올라가고 동작하게 되는데 이 상태의 프로그램을 프로세스라고 부른다.
프로세스는 쓰레드일수 있지만 쓰레드는 프로세스 일 수 없다. 프로세스가 스레드보다 큰 범위에 있다.
프로세스는 독립적으로 메모리에 등록된다.
Runnable을 상속하여 만든 객체는 Thread 객체에 넣어서 실행해야함.
Runnable 사용법-
package study.code.thread;
public class Flag implements Runnable {
@Override
public void run() {
for ( int i = 0; i < 10; i++) {
if( i % 2 ==0) {
System.out.println("백기올려");
}else
System.out.println("청기올려");
}
}
}
package study.code.thread;
public class FlagMain {
public static void main(String[] args) {
//Runnable을 상속하여 만든 객체는 Thread 객체에 넣어서 실행해야함.
Thread thflag = new Thread(new Flag());
thflag.start();
Runnable rn = () ->{
for(int i = 1; i <= 10; i++) {
if( i%2 ==1 ) {
System.out.println("백기올려");
}else
System.out.println("청기올려");
}
};
System.out.println("================");
Thread thflag2 = new Thread(rn);
thflag2.start();
}
}
Runnable로 상속받은 객체를 Thread 객체에 넣어 실행하거나,
Runnable로 선언된 메서드를 Thread 객체에 넣어서 실행한다.
또한....run()을 오버라이드 해서 메서드를 생성해야한다.
쓰레드2개가 돌다보면 동시에 같은자원에 접근할 수도 있고 그럴땐 에러가 날 수 있다.
따라서 동기화처리를 해줘야한다.
스레드를 동기화처리해주면 자원부여에 대한 순서부여가 가능해져서 스레드가 같은 자원을 점유해 발생하는 오류를 막을 수 있다.
동기화는 메서드를 동기화시켜줄 수 있으며, 원하는 부분만 부분동기화도 가능하다.
짐 쌓고 나르기 ex
package study.thread.state;
public class AddStack extends Thread {
private Storage st;
public AddStack(Storage st) {
this.st = st;
}
public void run() {
try {
while(true) {
Thread.sleep(100);
if(this.st.getStackCount() == 0) {
System.out.println("짐 추가 ");
this.st.addStack(10);
}
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package study.thread.state;
public class PopStack extends Thread {
private Storage st;
public PopStack(Storage st) {
this.st = st;
}
public void run() {
try {
while(true) {
Thread.sleep(100);
System.out.println("짐 5개씩 나르기");
this.st.popStack(5);
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package study.thread.state;
public class Storage {
private int stackCount = 10; //물건 10개 가진다.
public synchronized void addStack(int stackCount) {
this.stackCount += stackCount;
if(this.stackCount >= 10) {
System.out.println("나르세요!");
//스레드 깨우기
notify();
}
}
public synchronized void popStack(int leaveCount) {
if(leaveCount > this.stackCount) {
this.stackCount = 0;
}else {
this.stackCount -= leaveCount;
}
System.out.println("현재 짐 개수 " + this.getStackCount());
try {
if(this.stackCount ==0) {
System.out.println("집이 없음 대기");
wait();
}
}catch (InterruptedException e) {
e.printStackTrace();
}
}
public int getStackCount() {
return this.stackCount;
}
}
package study.thread.state;
public class StorageMain {
public static void main(String[] args) {
Storage s = new Storage();
AddStack as = new AddStack(s);
PopStack ps = new PopStack(s);
as.start();
ps.start();
}
}
'교육전 개인공부' 카테고리의 다른 글
리스트로 수정해보는 로또 (1) | 2023.10.29 |
---|---|
파일 입출력 (0) | 2023.10.28 |
정렬, 비교, 람다 (0) | 2023.10.25 |
컬렉션 프레임워크 (2) | 2023.10.23 |
기본 API클래스4 -Wrapper (1) | 2023.10.23 |
Comments