자바 쓰레드 - Java구두시험,DB구두시험

smkim·2021년 10월 18일
0
  • 학교에서 진행한 예제 복습

[문제]
2학년 학생들이 전공수업으로 JAVA와 DB를 수강하고 있다.
같은 과목, 같은 강의실에서 구두시험 치룸. 교단에 두 분의 교수님이 각각 앉아 있고 교수님 앞에는 구두시험 볼 학생 의자가 '하나씩' 놓여있다 .
구두시험 순서는 정해지지 X 의자에 먼저 앉는 학생이 구두시험을 볼 수 있다.
각 교수님과는 한 번에 한 학생만 시험을 볼 수 있다.
JAVA와 DB 구두시험은 서로 다른학생들이 동시에 볼 수 있다.

수정 전 코드

class Students extends Thread { 
	
	Student(String n){ 
		
		number=no; 
	} 
	public void run(){ 
		javaTest.javaTellTest(number);
		Students.dbTellTest(number); 
	
} 
}
class javaTest { 
	synchronized void javaTellTest("JAVA 구두시험본다");

} 

class DBProfessor { 
	synchronized void dbTellTest("DB 구두시험본다"); 
} 

class JavaTest2 { 
	public static void main(String[] args){ 
		
		int number=Integer.parseInt(args[0]);
		javaTest j = new javaTest();
		DBProfessor = new DBProfessor(); 
		Students s[] = new Students[number]; 
		for(int i=0; i<s.length; i++){
			s[i]=new Students(i+1,j);
			s[i].start(); 
	}
}

수정 후 코드
(해당 코드 실행 안되는 중. 일단 느낌만이라도 보자)

class Student extends Thread { // 학생 쓰레드 클래스 
	
	String hakbun,name;
	Professor javaPf,dbPf;

	Student(String h, String n, Professor jp, Professor dbp){ 
		hakbun=h; 
		name=n;
		javaPf=jp;
		dbPf=dbp;
	} 

	public void run(){ 
		javaPf.javaOralTest(hakbun,name);
		dbPf.dbOralTest(hakbun,name);
	
   } 
}

class Professor { // 공유자원 교수 클래스 

	int javaNo,dbNo;

	synchronized void javaOralTest(String hakbun, String name) { 
		try { 
			long time = System.currentTimeMillis();
			System.out.println(hakbun+name+"학생이 java 구두시험을"+time+"밀리 초에"+ ++javaNo + "번째로 본다");
			Thread.sleep(1);
		} catch(InterruptedException e) { } 
	}

	synchronized void dbOralTest(String hakbun, String name) { 
		try { 
			long time = System.currentTimeMillis();
			System.out.println(hakbun+name+"학생이 db 구두시험을"+time+"밀리 초에" ++dbNo + "번째로 본다");
			Thread.sleep(1);
		} catch(InterruptedException e) { } 
	} 
} 

public class OralTest { 
	public static void main(String[] args){ 
		
		Professor javaP = new Professor();
		Professor dbP = new Professor();

		Student st[] = new Student[args.length/2];

		for(int i=0; i<st.length; i++)
			st[i]=new Student(args[i*2],args[i*2+1],javaP,dbP);

		for(int i=0; i<st.length; i++) 
			st[i].start(); // 쓰레드 객체가 여러개일 때 start() 주는 법 
	}
}

헷갈렸던 내용, 기억해야 할 내용

  1. args[i*2],args[i*2+1]에서 첫번째는 hakbun이고 두번째는 name인데 왜 i*2+1을 해주는지 모르겠다.
    args[] 배열에 hakbun이 먼저 들어가고 그 다음 칸에 name이 들어가서 그런건가?
  2. sleep() 메소드가 나오면 무조건 try~catch()로 예외처리!
  3. 위에는 쓰레드 객체가 여러개이다( 다 같은 학생들) 그 여러 쓰레드 객체들에게 start()를 주어야 하는데 일일이 하나하나 줄 수 없다. 그래서 for문을 돌려 학생 객체 배열의 i 번째만큼? 길이만큼 해서 start()를 주어야 학생 쓰레드가 일을 한다.
  4. currentTimeMillis()는 int형으로는 값을 담기에 범위가 커서 long형으로 선언하였다
  5. run() 메소드는 학생 한 명이 하는 일들을 정의해놓았다. 결국 자바시험과 db시험을 보는 것이므로 학생 한 명이 자바시험과 db시험을 보는 것이다.
  6. 나는 왜 공유자원 객체는 학생으로만 정의하면 됐는데 교수 클래스 2개로 만든건가..
profile
컴퓨터공학과 학생 brandy 입니다. 개발+기획에 관심이 있지만, 개발 실력이 뛰어나진 않지만 성장하고자 하기 위해 벨로그를 작성합니다.

0개의 댓글