Loading...

JAVA/실습 / / 2022. 2. 3. 13:53

스레드 실습

반응형

 

 

스레드는 컨텍스트 스위칭(문맥 교환)을 한다.

조건 : 컨텐스트 스위칭은 다른 스레드의 제어권을 뺏는 행위

-> 스레드가 잠시라도 멈춰있어야 함.

 

스레드가 컨텍스트 스위칭을 할 때는 내부적으로 0.0000000001초라도 졸고 넘어간다.

스레드는 OS가 관리하기 때문에 이는 모든 언어가 공통적이다.

 

RR : 1초마다 제어권이 뺏기기로 되어 있음.

 

제어권이 넘어가지 않으면 직접 재워줘야 한다.

cpu가 엄청 집중하고 있으면 넘어가야 하는 것을 까먹어버리기 때문에

OS가 인터럽트를 걸어서 잠깐 재워준다.

 

 


 

새로운 클래스를 만들어

run 메서드를 구현한 코드▽

package site.metacoding.ex23;

// Host가 Monster 좌표에 도달하면 Monster 죽음
// Monster는 2초씩 자고 움직인다.
class Monster implements Runnable {
    int x = 10;
    int speed = 1;
    boolean check = true;

    @Override
    public void run() {
        while (check) {
            x = x + speed;
            System.out.println("Monster의 좌표 : " + x);

            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

// 1씩 계속 움직인다.
class Host implements Runnable {
    int x = 0;
    int speed = 2;
    boolean check = true;

    @Override
    public void run() {
        while (check) {
            x = x + speed;
            System.out.println("Host의 좌표 : " + x);

            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

// 실습 -> Host의 speed를 2로 만들고, Monster는 잠자지 않는다.
// -> Monster와 Host는 1초마다 각자의 speed 만큼 움직이는 run()을 가진다.
// -> 둘의 x좌표가 동일해지면 게임은 종료된다.
public class ThreadEx05 {
    public static void main(String[] args) {
        Monster monster = new Monster();
        Host host = new Host();

        Thread mThread = new Thread(monster);
        Thread hThread = new Thread(host);

        mThread.start();
        hThread.start();

        while (true) {
            if (monster.x == host.x) {
                monster.check = false;
                host.check = false;
                System.out.println("Host가 Monster를 잡았습니다.");
                System.out.println("Host 좌표 : " + host.x);
                System.out.println("Monster 좌표 : " + monster.x);
                break;
            } else {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

 

위 코드를 따라 화살표 함수를 사용한 코드▽

package site.metacoding.ex23;

// Host가 Monster 좌표에 도달하면 Monster 죽음
// Monster는 2초씩 자고 움직인다.
class Monster {
    int x = 10;
    int speed = 1;
    boolean check = true;
}

// 1씩 계속 움직인다.
class Host {
    int x = 0;
    int speed = 2;
    boolean check = true;
}

// 실습 -> Host의 speed를 2로 만들고, Monster는 잠자지 않는다.
// -> Monster와 Host는 1초마다 각자의 speed 만큼 움직이는 run()을 가진다.
// -> 둘의 x좌표가 동일해지면 게임은 종료된다.
public class ThreadEx05 {
    public static void main(String[] args) {
        Monster monster = new Monster();
        Host host = new Host();

        Thread mThread = new Thread(() -> {
            while (monster.check) {
                monster.x = monster.x + monster.speed;
                System.out.println("Monster의 좌표 : " + monster.x);

                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        
        Thread hThread = new Thread(() -> {
            while (host.check) {
                host.x = host.x + host.speed;
                System.out.println("Host의 좌표 : " + host.x);

                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        mThread.start();
        hThread.start();

        while (true) {
            if (monster.x == host.x) {
                monster.check = false;
                host.check = false;
                System.out.println("Host가 Monster를 잡았습니다.");
                System.out.println("Host 좌표 : " + host.x);
                System.out.println("Monster 좌표 : " + monster.x);
                break;
            } else {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
반응형