Q. 멀티프로세스와 멀티쓰레드의 차이점을 메모리 공유 관점에서 설명하세요.
A. 멀티프로세스는 프로세스 간의 메모리를 공유하지 않지만, 멀티쓰레드는 프로세스 내에서 메모리를 공유합니다. 그로 인해 멀티프로세스는 안정성이 높다는 장점이 있고 멀티쓰레드는 빠른 응답에 최적입니다.
Class MyThread extends Thread{
public void run(){
this.work();
}
public void work() {
for (int i=0; i<100; i++) {
System.out.println("Thread로 만든 " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
pulic class Main {
public static void main(String[] args){
MyThread t1 = new MyThread();
t1.start();
}
}
Q. 위의 코드를 익명 클래스와 람다식을 사용하는 방법으로 수정하세요.
A.
public class Main {
public static void main(String[] args){
Thread t = new Thread(
new Runnable() {
public void run() {
this.work();
}
public void work() {
for (int i=0; i<100; i++) {
System.out.println("익명클래스로 만든 " + i);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
);
t.start();
}
}
public class Main {
public static void main(String[] args){
Thread t = new Thread( () -> {
for (int i=0; i<100; i++) {
System.out.println("람다식으로 만든 " + i);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
t.start();
}
}
다음은 서로 다른 두 명의 user가 동일한 계좌에 각각 접근하여 입금 또는 출금을 하는 상황에 대한 코드이다.
class BankAccount {
int balane;
public void deposit (int amount) {
System.out.println("User : + " + amount);
this.balane += amount; //입금
}
public void withdraw(int amount) {
System.out.println("User : - " + amount);
this.balane -= amount; //출금
}
public int getBalance() {
System.out.println("잔고 : " + this.balane);
return this.balane;
}
}
class User implements Runnable {
BankAccount account;
public User(BankAccount account) {
this.account = account;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i=0; i<10; i++) {
account.deposit(10000);
Thread.sleep(20);
account.withdraw(10000);
if (account.getBalance() < 0) {
System.out.println("오류발생!");
}
}
}
}
public class MyBank {
static BankAccount account = new BankAccount();
public static void main(String[] args) {
Thread one = new Thread(new User(account));
Thread two = new Thread(new User(new BankAccount());
one.start();
two.start();
}
}
Q. 위의 세 클래스에 대한 내용 중 수정할 내용을 각각 하나씩 서술하세요.
A.
class BankAccount : deposit과 withdraw앞에 synchronized를 붙인다.
class User : Thread.sleep(20)을 try/catch블럭으로 감싸준다.
class MyBank : Thread two = new Thread(new User(account)로 수정하여 one과 two가 동일한 객체를 참조하도록 하여, 앞서 BankAccount에서 설정한 동기화가 무력화되지 않도록 한다.
- synchronized에 의해 한 순간 하나의 쓰레드 만이 허용되어, 두 user가 동일한 account에 접근할 때 오류가 발생하지 않도록 한다.
- InterruptedException을 처리하기 위해 Thread.sleep( )을 사용할 때는 try-catch를 사용하도록 한다.
Q. 쓰레드의 상태 제어 메소드 중 sleep( )과 wait( )의 공통점과 차이점에 대해 서술하세요.
A. 두 메소드 모두 쓰레드의 일시 중지시키는 역할을 합니다. 다만, sleep( )은 락을 유지한 채 지정한 시간이 지나면 자동으로 재개되는 반면 wait( )은 락을 반납한 채, 누군가가 notify( ) 또는 notifyAll( )을 해줄 때까지 정지 상태를 유지합니다.