▼정답
단일 프로세스 : 명령어 기반, 한 번에 한 작업만 실행 가능.(Dos, CMD)
멀티 프로세스 : 여러 개의 프로그램 동시 작업 가능.(windows)
멀티 프로세스 원리 : CPU는 하나지만, 속도가 빠르기 때문에 번갈아 실행시킨다.(컨텍스트 스위칭)
(A프로그램 실행 후 한 번 중단했다가 B프로그램을 실행시킴 | 끊기지 않고 동시 실행된다.)
▼정답
프로세스 : 실행 중인 프로그램, 자원(resources)과 스레드로 구성
스레드 : 프로세스 내에서 실제 작업을 수행. (프로세스 내에서 실행되는 여러 흐름의 단위)
모든 프로세스는 하나 이상의 쓰레드를 가지고 있다.
(하나의 프로그램(프로세스) 안에 또 다른 프로그램(프로세스))
for(int i=0; i < 300; i++)
System.out.printf("%s", new String("-"));
for(int i=0; i < 300; i++)
System.out.printf("%s", new String("|"));
▼정답
package ThreadTest;
public class MultiThreadTest {
public static void main(String[] args) {
// 프로그램이 3개 돌아간다. MultiThreadTest main(), MyThread1 run(), MyThread2 run()
// 스레드는 별도의 프로그램이기 때문에 main이 먼저 끝나고 나서도 MyThread1과 MyThread2이 실행된다.
MyThread1 th1 = new MyThread1();
MyThread2 th2 = new MyThread2();
th1.start(); // OS한테 스레드 돌릴 거니까 돌아갈 수 있도록 방을 하나 생성해달라 요청.(OS가 스레드를 관리)
th2.start();
// th1.run(); // 으로 호출하면 실행되지만 절대 하면 안된다.
}
}
class MyThread1 extends Thread { // 동시에 돌리고 싶은 작업을 분리
public void run() { // run() : main의 역할
for (int i = 0; i < 300; i++) {
System.out.print("-");
}
} // run()
}
class MyThread2 extends Thread {
public void run() {
for (int i = 0; i < 300; i++) {
System.out.print("|");
}
} // run()
}
메인 스레드가 종료되더라도 실행 중인 스레드가 하나라도 있다면 프로세스는 종료되지 않습니다.
▼정답
스레드는 별도의 프로그램이기 때문에 main이 먼저 끝나고 나서도 MyThread1과 MyThread2이 실행된다.
학생마다 Student 객체를 생성하고, 4명의 학생 정보를 ArrayList<Student> 컬렉션에 저장한 후에,
ArrayList<Student>의 모든 학생(4명) 정보를 출력하고
학생 이름을 입력 받아 해당 학생의 학점 평균을 출력하는 프로그램을 작성하라.
학생 이름, 학과, 학번, 학점평균 입력하세요.
>> 황기태, 모바일, 1, 4.1
>> 이재문, 안드로이드, 2, 3.9
>> 김남윤, 웹공학, 3, 3.5
>> 최찬미, 빅데이터, 4, 4.25
----------------------------------
이름: 황기태
학과: 모바일
학번: 1
학점평균: 4.1
----------------------------------
이름: 이재문
학과: 안드로이드
학번: 2
학점평균: 3.9
----------------------------------
이름: 김남윤
학과: 웹공학
학번: 3
학점평균: 3.5
----------------------------------
이름: 최찬미
학과: 빅데이터
학번: 4
학점평균: 4.25
----------------------------------
학생 이름 >> 최찬미
최찬미, 빅데이터, 4, 4.25
학생 이름 >> 이재문
이재문, 안드로이드, 2, 3.9
학생 이름 >> 그만
▼정답
package ThreadTest;
import java.util.*;
class Student {
String name;
String major;
String num;
String avg;
public Student(String name, String major, String num, String avg) {
this.name = name;
this.major = major;
this.num = num;
this.avg = avg;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("----------------------------------" + "\n");
sb.append("이름: " + name + "\n");
sb.append("학과: " + major + "\n");
sb.append("학번: " + num + "\n");
sb.append("평균: " + avg + "\n");
return sb.toString();
}
}
public class Test1 {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
StringTokenizer t;
String inName = null;
Scanner sc = new Scanner(System.in);
System.out.println("학생 이름, 학과, 학번, 학점평균 입력하세요.");
while (list.size() < 4) {
String st = sc.nextLine();
t = new StringTokenizer(st, " ,");
while (t.hasMoreTokens()) {
list.add(new Student(t.nextToken(), t.nextToken(), t.nextToken(), t.nextToken()));
}
}
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
System.out.println("----------------------------------");
while (true) {
System.out.print("학생 이름 >> ");
String input = sc.nextLine();
if (input.equals("그만")) {
System.out.println("종료합니다.");
break;
}
System.out.println("----------------------------------");
for (int i = 0; i < list.size(); i++) {
if (input.equals(list.get(i).name)) {
String[] stu = { list.get(i).name, list.get(i).major, list.get(i).num, list.get(i).avg };
for (int j = 0; j < stu.length; j++) {
System.out.print(j < stu.length - 1 ? stu[j] + ", " : stu[j] + "\n");
}
}
}
}
}
}
ArayList<Student> 대신, HashMap<String, Studnet> 해시맵을 이용하여 다시 작성하라.
해시맵에서 키는 학생 이름으로 한다.