본문 바로가기
Programming Study/절대JAVA

[절대JAVA]8장 프로그래밍 연습문제(2)

by 푸고배 2018. 9. 27.

5. 위에서 작성한 스레드 PrimeNumber01을 참고하여 다음 조건을 만족하도록 스레드 PrimeNumber02 프로그램을 작성하여 클래스 Ex05의 main() 메소드에서 테스트하시오.

- 클래스 PrimeNumber02는 1에서 지정된 생성자의 인자까지 소수를 구하여, 지정된 스레드 이름을 출력한 후 소수를 모두 출력하는 프로그램

- 클래스 Ex05의 main() 메소드에서 다음을 실행하면 지정된 스레드 이름이 출력되고, 1에서 20사이의 소수가 다음과 같이 출력

PrimeNumber02 pn = new PrimeNumber02(20, "소수 만드는 스레드");

pn.start();

 소수 만드는 스레드:

 2    3     5     7    11    13    17    19

<소스코드>

Ex05.java

package Chapter8_5;


public class Ex05 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PrimeNumber02 pn = new PrimeNumber02(20,"소수 만드는 스레드");
		pn.start();
	}

}

PrimeNumber02.java

package Chapter8_5;

public class PrimeNumber02 extends Thread{
	int num;
	PrimeNumber02(int num, String name){
		setName(name); // 입력받은 인자를 스레드의 이름으로 지정
		this.num = num;
	}
	public void run() {
		boolean s = true;
		System.out.println(getName()+":");
		for(int i=2;i<=num;i++) { // 2부터 num까지
			for(int j=2;j<i;j++) { // 2부터 i까지의 숫자로
				if(i%j==0) { // 나누었을때 나누어 떨어지면
					s = false; // 소수가 아니다.
					break; // 다음 숫자로 넘어가기 위해 바로 정지
				}
			}
			if(s) { // true이면 (=소수이면)
				System.out.print(i+"\t");
			}
			s = true;
		}
	}
	
}

 

6. 위에서 작성한 스레드 PrimeNumber02를 참고하여 다음 조건을 만족하도록 스레드 PrimeNumber03 프로그램을 작성하여 클래스 Ex06의 main() 메소드에서 테스트하시오.

- 클래스 PrimeNumver03은 인터페이스 Runnable을 구현하는 클래스로 1에서 지정된 생성자의 인자까지 소수를 구하여, 스레드 이름을 출력한 후 소수를 모두 출력하는 프로그램 구현

- 클래스 Ex06의 main() 메소드에서 다음을 실행하면 지정된 스레드 이름이 출력되고, 1에서 20사이의 소수가 다음과 같이 출력

     new Thread(new PrimeNumber03(25), "소수 만드는 스레드").start();

 소수 만드는 스레드:

 2    3     5     7    11    13    17    19    23

<소스코드>

Ex06.java

package Chapter8_6;

public class Ex06 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Thread(new PrimeNumber03(25),"소수 만드는 스레드").start(); // 두번째 인자 = 스레드 이름
	}

}

PrimeNumber03.java

package Chapter8_6;

public class PrimeNumber03 implements Runnable{
	int num; // 인자를 저장할 변수
	PrimeNumber03(int num){
		this.num=num;
	}
	public void run() {
		boolean s = true;
		System.out.println(Thread.currentThread().getName()+":"); // 현재 스레드의 이름 출력
		for(int i=2;i<=num;i++) { // 2부터 num까지
			for(int j=2;j<i;j++) { // 2부터 i까지의 숫자로
				if(i%j==0) { // 나누었을때 나누어 떨어지면
					s = false; // 소수가 아니다.
					break; // 다음 숫자로 넘어가기 위해 바로 정지
				}
			}
			if(s) { // true이면 (=소수이면)
				System.out.print(i+"\t");
			}
			s = true;
		}
	}

}

 

7. 클래스 PrintTime은 인터페이스 Runnable을 구현하는 클래스로 지정된 생성자의 횟수만큼 현재 시간과 스레드 이름을 출력하는 프로그램으로 다음 조건을 만족하도록 스레드 PrintTime 프로그램을 작성하여 클래스 Ex07의 main() 메소드에서 테스트하시오.

- 클래스 Ex07의 main() 메소드에서 다음을 실행하면 다음과 같이 출력

PrintTime p1 = new PrintTime(3);
Thread th1 = new Thread(p1, "안녕하세요!");
th1.setPriority(Thread.MAX_PRIORITY-1); // 우선순위 가장 높음-1
th1.start();
PrintTime p2 = new PrintTime(6);
Thread th2 = new Thread(p2, "반갑습니다.");
h2.setPriority(Thread.NORM_PRIORITY-1); // 우선순위 중간-1
th2.start();

순위: 4 Thu Sep 27 10:40:18 KST 2018 반갑습니다.
순위: 9 Thu Sep 27 10:40:18 KST 2018 안녕하세요!
순위: 4 Thu Sep 27 10:40:19 KST 2018 반갑습니다.
순위: 9 Thu Sep 27 10:40:19 KST 2018 안녕하세요!
순위: 9 Thu Sep 27 10:40:20 KST 2018 안녕하세요!
순위: 4 Thu Sep 27 10:40:20 KST 2018 반갑습니다.
순위: 4 Thu Sep 27 10:40:21 KST 2018 반갑습니다.
순위: 4 Thu Sep 27 10:40:22 KST 2018 반갑습니다.
순위: 4 Thu Sep 27 10:40:23 KST 2018 반갑습니다. 

<소스코드>

Ex07.java

package Chapter8_7;


public class Ex07 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PrintTime p1 = new PrintTime(3);
		Thread th1 = new Thread(p1, "안녕하세요!");
		th1.setPriority(Thread.MAX_PRIORITY-1); // 우선순위 가장 높음-1
		th1.start();
		PrintTime p2 = new PrintTime(6);
		Thread th2 = new Thread(p2, "반갑습니다.");
		th2.setPriority(Thread.NORM_PRIORITY-1); // 우선순위 중간-1
		th2.start();
	}

}

PrintTime.java

package Chapter8_7;

import java.util.Date;

public class PrintTime implements Runnable{
	int num; // 반복횟수
	Date now;
	public PrintTime(int num) {
		this.num = num;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			for(int i=0;i<num;i++) {
				now = new Date();
				Thread.sleep(1000); // 딜레이를 주기 위해
				System.out.println("순위: "+Thread.currentThread().getPriority()+
						" "+now+" "+Thread.currentThread().getName());
			}
		}catch(InterruptedException e) {
			e.printStackTrace();
		}
	}

}

 

참고자료 : 인피니티북스 절대 JAVA

github 주소 : 

https://github.com/ch1517/Network-programming/tree/master/Chapter8

반응형

댓글