본문 바로가기

JAVA

JAVA(2022.06.02) - 쓰레드와 공유객체

- 하나의 객체를 여러 개의 Thread가 사용한다는 것을 의미한다 

ex) 

공유객체 > 그네 

쓰레드 > 아이(사용자) 

- 공통으로 사용할 것을 클래스와 인스턴스로 만든다

- 위 인스턴스와 클래스를 각각의 쓰레드에서 사용한다 

 

코드예시) 

 

공유객체 MusicBox

  public class MusicBox { 
        //신나는 음악!!! 메시지가 1초이하로 쉬면서 10번 출력
        public void playMusicA(){
            for(int i = 0; i < 10; i ++){
                System.out.println("신나는 음악!!!");
                try {
                    Thread.sleep((int)(Math.random() * 1000)); //대기시간을 지정. 이클립스가 알아서 예외처리를 해준다 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }      
        } //playMusicA

        //슬픈 음악!!!이란 메시지가 1초이하로 쉬면서 10번 반복출력
        public void playMusicB(){
            for(int i = 0; i < 10; i ++){
                System.out.println("슬픈 음악!!!");
                try {
                    Thread.sleep((int)(Math.random() * 1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }        
        } //playMusicB
        //카페 음악!!! 이란 메시지가 1초이하로 쉬면서 10번 반복출력
        public void playMusicC(){
            for(int i = 0; i < 10; i ++){
                System.out.println("카페 음악!!!");
                try {
                    Thread.sleep((int)(Math.random() * 1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }        
        } //playMusicC  
    }

 

Thread객체 MusicPlayer 

 

- Thread를 상속하고 있기 때문에 run() 메소드를 구현 

    public class MusicPlayer extends Thread{
        int type;
        MusicBox musicBox;  
        // 생성자로 부터 musicBox와 정수를 하나 받아들여서 필드를 초기화
        public MusicPlayer(int type, MusicBox musicBox){
            this.type = type;
            this.musicBox = musicBox;
        }       
        // type이 무엇이냐에 따라서 musicBox가 가지고 있는 메소드가 다르게 호출
        
        //Thread를 상속하면 run 메소드를 구현해야한다 
        public void run(){
            switch(type){
                case 1 : musicBox.playMusicA(); break;
                case 2 : musicBox.playMusicB(); break;
                case 3 : musicBox.playMusicC(); break;
            }
        }       
    }

MusicBoxExam1 클래스 

 

- Thread의 병행처리를 위해 start() 메소드 구현 

    public class MusicBoxExam1 {

        public static void main(String[] args) {
            // MusicBox 인스턴스
            MusicBox box = new MusicBox();

            MusicPlayer kim = new MusicPlayer(1, box);
            MusicPlayer lee = new MusicPlayer(2, box);
            MusicPlayer kang = new MusicPlayer(3, box);

            // MusicPlayer쓰레드 실행
            // start() 메소드를 통해 쓰레드의 병행처리 구현(순서대로 출력X) 
            kim.start();
            lee.start();
            kang.start();           
        }   
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

* 위 게시물은 프로그래머스<자바중급> 강의를 복습하며 정리한 글입니다*