[문제]
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() 주는 법
}
}
헷갈렸던 내용, 기억해야 할 내용