TestJavaSync.java

7814 ワード

[運転結果]

完全なコード
import java.lang.*; 

class Student extends Thread { // 쓰레드 학생 클래스 
	String name; // 학생 이름 
	int hakbun; // 학생 학번 
	int time=System.currentTimeMillis(); //시험 시간 
	
	Student(String n,int h,int t){ 
		super(name);
		super(hakbun); 
		super(time);
	} 
	public void run() { 
		Test.test(int h,String n);
		Test.goBackHome(int h,String n);
		Test.checkProfessor(int h,String n);
		Test.checkTestTime(int h,String n,int h); 
	} 
} 

class Test { // 공유자원 클래스 

void test(int h,String n){ 
	System.out.println(hakbun+"번"+name+"가 JAVA 시험을 보고있다"); 
} 
void goBackHome(int h,String n){ 
	System.out.println(hakbun+"번"+name+"가 집으로 돌아간다"); 
} 
synchronized void checkProfessor(int h,String n) { 
	System.out.println("안유정교수가"+hakbun+"번"+name+"의 시험지를 확인하고 접수했다"); 
	}
void checkTestTime(int h,String n,int h){ 
	if(time>700){
		time.sleep(1.0);
	}
	else { System.out.println(hakbun+"번"+name+"가 시험본 시간은"+time.random()); } 
}

class TestJavaSync { // main 클래스 
	public static void main(String[] args){ 
		Student s1 = new Student("김별이",2020081001,time);
		Student s2 = new Student("유준서",2018081100,time);
		Student s3 = new Student("이지은",2019081077,time);
	
		s1.start();
		s2.start();
		s3.start();
	} 
} 
コードの変更
class Professor { // 공유자원 교수 클래스 
	String name; 
	Professor(String n) { name = n; } 

	synchronized void check_testpaper(Student s) { 
		s.end = System.currentTimeMillis();
		System.out.println(s.number+"번"+s.name+"가 시험본 시간은"+(s.end-s.begin)+"ms");
		if((s.end-s.begin)<=700)
			System.out.println(name+"교수가"+s.number+"번"+s.name+"의 시험지를 확인하고 접수했다");
		else 
			System.out.println(s.number+"번"+s.name+"의 시험지는 time over"); 
	}
} 

class Student extends Thread { 
	Professor prof;
	String name;
	int number; 
	long begin,end; 

 	Student(Professor p,String n,int no){ 
		prof = p;
		name = n; 
		number = no; 
	} 
	public void run() { 
		begin = System.currentTimeMillis(); // end가 없는 이유는 교수님이 시간 check 
		testJava(name,number); // n,no라고 매개변수 값을 주면 어떻게 되지? 
		prof.check_testpaper(this); // 교수 객체가 시험지를 check하는 것이니 prof.check~ 
		goHome(name,number);
	} 

	void testJava(String n,int no){ 
		System.out.println(no+"번"+n+"가 JAVA 시험을 보고있다"); 
		try {                         
			Thread.sleep((int)(Math.random()*1000)); } 
		catch(InterruptedException e) { } 
	} 
	void goHome(String n,int no){ 
		System.out.println(no+"번"+n+"가 집으로 돌아간다");
}
} 

public class TestJavaSync2 { 
	public static void main(String[] args){ 
		Professor p = new Professor("방탄소년단");
		Student s1 = new Student(p,"김별이",2020081001); 
		Student s2 = new Student(p,"이지은",2019081077);
		Student s3 = new Student(p,"유준서",2018081100);
		s1.start();
		s2.start();
		s3.start();
	} 
}
コード比較
mainクラス(私)
class TestJavaSync { // main 클래스 
	public static void main(String[] args){ 
		Student s1 = new Student("김별이",2020081001,time);
		Student s2 = new Student("유준서",2018081100,time);
		Student s3 = new Student("이지은",2019081077,time);
	
		s1.start();
		s2.start();
		s3.start();
	} 
} 
mainクラス(修正)
public class TestJavaSync2 { 
	public static void main(String[] args){ 
		Professor p = new Professor("방탄소년단");
		Student s1 = new Student(p,"김별이",2020081001); 
		Student s2 = new Student(p,"이지은",2019081077);
		Student s3 = new Student(p,"유준서",2018081100);
		s1.start();
		s2.start();
		s3.start();
	} 
}
  • 共有リソースの教育対象宣言は生成されなかった.
  • 時間(時間)を共有するのではなく、学生が教育対象を共有するので、教育対象(同じメモリで共有可能)
  • を共有させるべきです.
    Student Thread Class(私)
    import java.lang.*; 
    
    class Student extends Thread { // 쓰레드 학생 클래스 
    	String name; // 학생 이름 
    	int hakbun; // 학생 학번 
    	int time=System.currentTimeMillis(); //시험 시간 
    	
    	Student(String n,int h,int t){ 
    		super(name);
    		super(hakbun); 
    		super(time);
    	} 
    	public void run() { 
    		Test.test(int h,String n);
    		Test.goBackHome(int h,String n);
    		Test.checkProfessor(int h,String n);
    		Test.checkTestTime(int h,String n,int h); 
    	} 
    } 
    
    Student Threadクラス(修正)
    class Student extends Thread { 
    	Professor prof;
    	String name;
    	int number; 
    	long begin,end; 
    
     	Student(Professor p,String n,int no){ 
    		prof = p;
    		name = n; 
    		number = no; 
    	} 
    	public void run() { 
    		begin = System.currentTimeMillis(); // end가 없는 이유는 교수님이 시간 check 
    		testJava(name,number); // n,no라고 매개변수 값을 주면 어떻게 되지? 
    		prof.check_testpaper(this); // 교수 객체가 시험지를 check하는 것이니 prof.check~ 
    		goHome(name,number);
    	} 
    
    	void testJava(String n,int no){ 
    		System.out.println(no+"번"+n+"가 JAVA 시험을 보고있다"); 
    		try {                         
    			Thread.sleep((int)(Math.random()*1000)); } 
    		catch(InterruptedException e) { } 
    	} 
    	void goHome(String n,int no){ 
    		System.out.println(no+"번"+n+"가 집으로 돌아간다");
    }
    } 
    
  • 試験時間currentTimeMillis()は、int型変数ではなく長い変数でbegin、endを個別に定義する必要があります.
  • 専門科目の授業対象を別途発表しなければならない.それは資料型の授業ではなく、私が別途した専門科目の教育変数です.
  • プライマリクラスでは、オブジェクトの作成時に定義された教授オブジェクトの共有、名前、および学号は、作成者から取得する必要があります.作成者は、作成者が実行するときにのみ値が生きているため、メンバー変数を個別に指定して挿入する必要があります.
  • Threedが動作するrun()クラスには、Threedが動作する内容が含まれています.begin変数内にはシステムからの試験時間が必要であるため,システムクラス内のtimeメソッドを用いて学生が試験を開始する時間を受信しなければならない.int型変数にtime~メソッド値を入れる方式で行ったのですができません
  • run()メソッドには、すべてのスレッドで実行する必要があるアクションがリストされています.void testJavaメソッドまたはvoid goHomeメソッドでは、非同期メソッドの学生スレッドクラスで十分に動作するため、非共有リソースクラスのスレッドクラスで>この内容を共有リソースクラスに宣言した場合?
  • testJavaメソッドのMath.randomは整数を生成しますが、0.0~1.0の小数を返します.だから1000を乗じて整数に変換します.
  • testJava内でsleepを使用しているため、sleep()状態から目が覚めない可能性があるため、try~catch文を使用して例外処理を行う必要があります.ここでsleepが使われるとは思わなかったし、sleep()が現れるときはtry~catch例外処理をしなければならないことも無視した.
  • Professer共有リソースクラス(または)
    class Test { // 공유자원 클래스 
    
    void test(int h,String n){ 
    	System.out.println(hakbun+"번"+name+"가 JAVA 시험을 보고있다"); 
    } 
    void goBackHome(int h,String n){ 
    	System.out.println(hakbun+"번"+name+"가 집으로 돌아간다"); 
    } 
    synchronized void checkProfessor(int h,String n) { 
    	System.out.println("안유정교수가"+hakbun+"번"+name+"의 시험지를 확인하고 접수했다"); 
    	}
    void checkTestTime(int h,String n,int h){ 
    	if(time>700){
    		time.sleep(1.0);
    	}
    	else { System.out.println(hakbun+"번"+name+"가 시험본 시간은"+time.random()); } 
    }
    Professer共有リソースクラス(変更)
    class Professor { // 공유자원 교수 클래스 
    	String name; 
    	Professor(String n) { name = n; } 
    
    	synchronized void check_testpaper(Student s) { 
    		s.end = System.currentTimeMillis();
    		System.out.println(s.number+"번"+s.name+"가 시험본 시간은"+(s.end-s.begin)+"ms");
    		if((s.end-s.begin)<=700)
    			System.out.println(name+"교수가"+s.number+"번"+s.name+"의 시험지를 확인하고 접수했다");
    		else 
    			System.out.println(s.number+"번"+s.name+"의 시험지는 time over"); 
    	}
    } 
    
    1.私はどうして共有資源類を専門家ではなく試験と見なしているのですか.今考えてみると、試験は学生たちが同時に見て、試験が終わる順番に行われているのに、なぜ最初から「試験」を共有資源としているのだろうか.教授は一人で、答案用紙には学生が一人しかいないので、教授を共有資源に設定しなければならない.(学生共有リソース)
    2.共有リソースProfesserクラスでは、教育対象が採用すべき同期方法のみが個別に定義されています.私はすべての方法を入れた.(syn~キーワードで同期方法を区別した)
    3.試験時間が700 msを超えると、授業対象者はタイムアウトを出力し、ここで終了時間を作成し、700 msと判断する.
    s.nameをパラメータとしてStudentクラスからsをパラメータとして取得する.したがって,Studentクラス内の(学生の)nameである.このように接近しなければならない.
    4.答案を提出するか、時間を超えて答案を提出できないかは教育対象の判断である.したがって、studentオブジェクトのs.end-s.beginで試験時間を判断し、if~else文を用いて共有リソースの教育クラスに時間通りに試験用紙を提出するかどうかを設定する必要があります.