티스토리 뷰

thread A, B를 번갈아가며 count 변수를 증가시켜주고 thread a, b가 끝났을때 끝났다는 문구를 출력하고 끝났을때의 count값을 출력하고

메인이 종료되었다고 출력

join, notity, wait

// 2014244057 이종민


package assignment;


import java.util.Scanner;


class WorkObject{

static int count = 0; // 많은곳에서 써야해서 static 변수 선언

Scanner scanner = new Scanner(System.in);

int MAX = scanner.nextInt(); // 요구사항 1: 프로그램이 시작되면 사용자는 카운터의 Max값 (정수)을 입력한다

synchronized void methodA() {

//요구사항 2: 생성된 2개의 스레드들은 공유객 체의 필드인 count변수를 번갈아가면서 1씩 증가시킨다. (정확히 한번 씩 증가 필요) 

//요구사항 3: 증가되는 count 값은 사용자가 입력한 Max값까지 증가된다.

WorkObject.count++; 

//요구사항 4: 각 스레드가 count를 1증가시킬 때 마다 어떤 스레드가 값을 증가시켰는지를 증가된 count 값과 함께 출력시킨다

System.out.println("ThreadA의 methodA() 작업 실행 : " + count);

notify(); // ThreadB를 실행대기 상태로 만듬


try {

wait();// ThreadA를 일시 정지 상태로 만듬

}catch(InterruptedException e) {

}

notifyAll(); // ThreadA, B에서 끝나게 되면 서로 실행대기 상태를 못만들게 되서 추가 

}

synchronized void methodB() {

//요구사항 2: 생성된 2개의 스레드들은 공유객 체의 필드인 count변수를 번갈아가면서 1씩 증가시킨다. (정확히 한번 씩 증가 필요) 

//요구사항 3: 증가되는 count 값은 사용자가 입력한 Max값까지 증가된다.

WorkObject.count++;

//요구사항 4: 각 스레드가 count를 1증가시킬 때 마다 어떤 스레드가 값을 증가시켰는지를 증가된 count 값과 함께 출력시킨다

System.out.println("ThreadB의 methodB() 작업 실행 : " + count);

notify(); // ThreadA를 실행대기 상태로 만듬

try {

wait(); //ThreadB를 일시 정지 상태로 만듬

}catch(InterruptedException e) {

}

notifyAll(); // ThreadA, B에서 끝나게 되면 서로 실행대기 상태를 못만들게 되서 추가

}

}


class ThreadA extends Thread{

private WorkObject workObject;

public ThreadA(WorkObject workObject) {

this.workObject = workObject; // 공유 객체를 매개값으로 받아 필드에 저장

}

@Override

public void run() {


while(true) {

//요구사항 5: 각 스레드는 count 값이 max값에 도달하면 종료된다.

if(workObject.count == workObject.MAX)// count값과 사용자의 입력값이 같다면

break;   // break;

else          // 아니면

workObject.methodA();   // methodA 호출

}

}

}


class ThreadB extends Thread{

private WorkObject workObject;

public ThreadB(WorkObject workObject) {

this.workObject = workObject; // 공유 객체를 매개값으로 받아 필드에 저장

}

@Override

public void run() {

while(true) {

//요구사항 5: 각 스레드는 count 값이 max값에 도달하면 종료된다.

if(workObject.count == workObject.MAX) // count값과 사용자의 입력값이 같다면

break;                             // break;

else                                   // 아니면

workObject.methodB();            // methodB 호출

}

}

}


public class ThreadAssignment {

public static void main(String[] args) {

System.out.print("Enter a Number for max value of the counter : ");

System.out.println("");

WorkObject sharedObject = new WorkObject(); // 공유 객체생성

//요구사항 2: 메인스레드는 2개의 스레드(threadA, threadB)를 생성한다

ThreadA threadA = new ThreadA(sharedObject);// threadA 객체생성

ThreadB threadB = new ThreadB(sharedObject);// threadB 객체생성

threadA.setPriority(Thread.MAX_PRIORITY); 

threadB.setPriority(Thread.MIN_PRIORITY);

//실행할 때 마다 A, B가 번갈아서 맨앞으로 나와 스트레스받아서 우선순위를 설정했으나 소용이 없습니다.

//sleep()을 시켜주면 되겠지만 요구사항에 없어 이렇게 둡니다.

threadA.start(); // threadA 시작

threadB.start(); // threadB 시작


try {

threadA.join(); //threadA의 종료를 기다림

System.out.println("End of ThreadA");

//요구사항 6: 각 스레드가 종료될 때 스레드의 종료를 알리는 메시지가 출력된다.

threadB.join(); //threadB의 종료를 기다림

System.out.println("End of ThreadB");

}catch (InterruptedException e){

}

System.out.println("Current Value of COUNT in sharedObject is : " + (sharedObject.count));

//요구사항 7: 메인스레드는 두 스레드가 모두 종료되면 현재 공유 객체의 count값을 출력시키고 프로그램 을 종료한다

System.out.println("End of Main Thread");

}

}





댓글
댓글쓰기 폼