Java Thread-Java口頭試験、DB口頭試験


  • 学校例復習
  • [質問]
    2年生は専門の授業を受けていて、JAVAとDBを聞いています.
    同じ授業で、同じ教室で口頭試験を受けます.二人の教授はそれぞれ教壇に座り、教授の前には口頭試験の学生椅子が置いてある.
    口頭試験の順序は固定されており、まずX椅子に座っている学生は口頭試験に参加することができる.
    教授ごとに1回に1人の学生しか試験できない.
    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() 주는 법 
    	}
    }
    紛らわしい内容、覚えなければならない内容
  • args[i*2]、args[i*2+1]のうち、1つ目はhakbun、2つ目はnameで、なぜi*2+1を与えたのか分かりません.
    args[]配列でhakbunが先に入って、それからnameなので?
  • sleep()メソッドが発生した場合はtry~catch()を使用して異常処理を行う必要があります!
  • の上に複数のThreadオブジェクト(同じ学生)があり、それらのThreadオブジェクトstart()を1つずつ与えることはできません.だからforドアを回して、学生オブジェクト配列のi番のように?長さに応じてstart()を与えるだけで、学生Threedは仕事をすることができます.
  • currentTimeMillis()はint型で表され、値の範囲が広いためlong型と宣言される
  • run()メソッドは、学生がしたことを定義します.最終的にjava試験とdb試験を受け、1人の学生がjava試験とdb試験を受けた.
  • 私はなぜ共有リソースの対象だけを学生と定義すればいいのか、それを2つの教授クラスに変えたのか...