Quiz #2

지우·2026년 1월 4일

java2

목록 보기
6/13

#1

Q. 멀티프로세스와 멀티쓰레드의 차이점을 메모리 공유 관점에서 설명하세요.

A. 멀티프로세스는 프로세스 간의 메모리를 공유하지 않지만, 멀티쓰레드는 프로세스 내에서 메모리를 공유합니다. 그로 인해 멀티프로세스는 안정성이 높다는 장점이 있고 멀티쓰레드는 빠른 응답에 최적입니다.

#2

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();
    }
}

#3

다음은 서로 다른 두 명의 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를 사용하도록 한다.

#4

Q. 쓰레드의 상태 제어 메소드 중 sleep( )과 wait( )의 공통점과 차이점에 대해 서술하세요.

A. 두 메소드 모두 쓰레드의 일시 중지시키는 역할을 합니다. 다만, sleep( )은 락을 유지한 채 지정한 시간이 지나면 자동으로 재개되는 반면 wait( )은 락을 반납한 채, 누군가가 notify( ) 또는 notifyAll( )을 해줄 때까지 정지 상태를 유지합니다.

0개의 댓글