본문 바로가기

Language/Java

[Java] 멀티쓰레드를 이용한 카운터

728x90
반응형

멀티 쓰레드를 이용한 카운터

* 요구사항

  • 프로그램 설명 : 멀티스레드를 이용한 카운터
  •  개발자 : 김성민(2015244055)
  •  개발 시작 날짜 : 18.06.04
  • 개발  종료 날짜 : 18.06.09
  •  요구사항 :
  •  1. 프로그램이 시작되면 사용자는 카운터의  Max값(정수)을 입력한다. 그리고 입력된  Max값은 공유 객체의 필드인 count의 초기값으로 사용된다.
  •  2. 메인스레드는 2개의 스레드(threadA,threadB)를 생성하고, 생성된 2개의 스레드들은 공유 객체의 필드인 count를 번갈아가면서 1씩 감소시킨다.
  •  3. 각 스레드가 count를 1감소시킬때 마다 어떤 스레드가 값을 감소시켰는지를 감소된 count값과 함꼐 출력시킨다.
  •  4. 각 스레드는 count값이 0에 도달 하면 종료된다.
  •  5. 각 스레드가 종료될때 스레드의 종료를 알리는 메세지가 출력된다.
  •  6. 메인스레드는 두 스레드가 모두 종료되면 현재 공유 객체의 count값을 출력시키고 프로그램을 종료한다.

 

* 소스 코드

public class waitNotifyExample {
    public static void main(String[] args) {
        
        System.out.print("Enter Max Value : ");
        
        WorkObject sharedObject = new WorkObject(); // 공유 객체를 생성
        ThreadA threadA = new ThreadA(sharedObject); //threadA 객체를 생성
        ThreadB threadB = new ThreadB(sharedObject); //threadB 객체를 생성
        
        threadA.start(); //threadA 시작
        threadB.start(); //threadB 시작
        
        //쓰레드 종료 대기 
        try {
            threadA.join();
            System.out.println("End Thread A");
            threadB.join();
            System.out.println("End Thread B");
            
        } catch (Exception e) {
            //System.out.println("Interrupted!!");
        }
        System.out.println("결과 : " +(sharedObject.count));
    }
}

메인 클래스

import java.util.Scanner;

public class WorkObject {
    static Scanner scanner = new Scanner(System.in); // 값을 입력 받음
    static int Max=scanner.nextInt();
    static int count=Max;//카운트 변수 초기값은 Max(입력 받은 값)
    
    public synchronized void methodA() { //동기화된 메소드 a
        WorkObject.count--; //카운트 변수 1씩 감소
        System.out.println("ThreadA 동작  : " + count );
        notify(); //대기상태
        try {
            wait(); //일시정지
        } catch (InterruptedException e) {
        }
        notifyAll();
    }

    public synchronized void methodB() { //동기화된 메소드 b
        WorkObject.count--;//카운트 변수 1씩 감소
        System.out.println("ThreadB 동작  : "+ count);
        notify(); //대기 상태
        try {
            wait(); //일시정지
        } catch (InterruptedException e) {
            }
        notifyAll();
        }
    
}

Thread 횟수 입력

public class ThreadA extends Thread {
    private WorkObject workObject;
    
    public ThreadA(WorkObject workObject) {
        this.workObject = workObject;
    }
    
    @Override
    public void run() { //출력 되는 부분
        while(true) {
            if(workObject.count!=0)//입력한 값이 0이 아니면
                workObject.methodA(); //메소드A 호출
            else
                break;//멈춘다
        }
    }
}

Thread A

public class ThreadB extends Thread{
    private WorkObject workObject;
    
    public ThreadB(WorkObject workObject ) {
        this.workObject = workObject;
    }
    
    @Override
    public void run() {  // 출력 되는 부분
        while(true) {
            if(workObject.count!=0)//count값이 0이 아니면
                workObject.methodB(); //메소드B 호출
            else
                break; //멈춘다
        }
    }
}

Thread B

* 프로그램 실행 화면

 

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] 두수를 입력 받아 사칙연산 하기  (0) 2019.07.09
[Java] 멀티쓰레드를 이용한 카운터  (0) 2018.06.09