티스토리 뷰
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");
}
}
'Java > for Class, Project' 카테고리의 다른 글
JAVA GUI 이벤트 처리 로그인 폼 (0) | 2017.10.23 |
---|---|
Java Swing Frame Example 스윙 프레임 예제 (0) | 2017.10.11 |
JAVA java9 eclipse(이클립스) NoclassdefFoundError 관련 실행불가 문제 해결 (0) | 2017.09.25 |
Java 자바 Thread 스레드 예제 (0) | 2017.09.20 |
JAVA PBL 저장용 (0) | 2017.09.18 |
티스토리 방명록
- Total
- Today
- Yesterday
Contact: j0n9m1n1@gmail.com