Java 쓰레드 & 파일 입출력

alert("april");·2023년 7월 19일
0

java

목록 보기
8/9
post-thumbnail

출처: https://velog.io/@myway00/JAVA-IO-Stream-BufferedStream-vs-InputStream-%EA%B7%B8%EB%A6%AC%EA%B3%A0-NIO%EB%A1%9C%EC%9D%98-%EB%B3%80%ED%99%94

쓰레드

동기화(Synchronization)

A쓰레드 B쓰레드가 작업을 진행할 때 A가 사용 중인 자원을 B가 사용하여 변경한다면
A의 작업 의도와 다르게 결과가 나타날 수 있다.
이러한 것을 방지하기 위해 하나의 자원을 여러 쓰레드가 동시에 접근하지 못하게 막는 것을
동기화라고 한다.

동기화 영역 만들기

동기화 블럭
	일부 소스코드만 동기화를 걸어준다.

동기화 메소드
	해당 메소드 전체에 동기화를 걸어준다.

Bank.java

package synchronizedTest;

public class Bank implements Runnable{

	public int money = 50000;
	
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			buyItem(5000);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {e.printStackTrace();}
		}
	}
	
	public /*synchronized*/ void buyItem(int money) {
		//	mutex : 우리가 동기화를 걸어줄 객체라고 보면 된다.
		synchronized(this) {
			this.money -= money;	// 누적 대입연산자
			System.out.println(Thread.currentThread().getName() + "이 출금");
			System.out.println("잔액 : " + this.money + "원");
		}
	}
}

shop.java

package synchronizedTest;
public class Shop {
	public static void main(String[] args) {
		
		Bank bank = new Bank();
		
		Thread mom = new Thread(bank, "April");
		Thread son = new Thread(bank, "Kyle");
		
		mom.start();
		son.start();
	}
}

Thread 종료 방법

interrupt()
- sleep(), join()을 사용하여 쓰레드가 멈췄을 때 interrupt()를 사용하면 예외를 발생시킬 수 있다.
- InterruptedException은 쓰레드를 멈출 때 사용하는 일종의 신호라고 생각하면 된다.
- interrupt() 메소드는 쓰레드 종료에 사용된다.

1. 쓰레드 객체의 interrupt()를 사용하여 InterrupException을 발생시켜 try~catch문으로 이동시킨다.
여기서 InterruptedException은 쓰레드를 대기상태로 만드는 sleep(), join()등의 메소드를 사용한 곳에서 발생된다. 위의 메소드들에 예외처리하고 interrupt()를 통해 예외를 발생시키면 쓰레드의 흐름이 해당 메소드의 catch문으로 이동된다. 예외처리를 했다고 강제종료가 되는 것이 아니므로 catch문에서 쓰레드가 종료될 수 있는 코드를 작성하여 처리해줘야한다.

2. System.exit(0) 을 사용하면 전체 쓰레드가 종료된다. (프로그램 종료)

3. 쓰레드 객체를 대기상태로 만드는 메소드를 사용하지 않았을 경우 Thread.interrupted()를 사용하면
interrupt()의 사용여부를 boolean타입으로 반환한다.
이 점을 이용하여 쓰레드의 흐름을 제어할 수 있다.
단, interrupted()를 한 번 사용하거나 예외처리로 catch문으로 이동하면 interrupted()는 다시 false를 반환한다.

파일입출력

스트림(Stream)

데이터를 주고받는 통로
데이터는 바이트 형태로 전송된다.

버퍼(buffer)

데이터 전송할 때 데이터를 임시로 저장하는 공간(임시 저장공간)

스트림과 버퍼

데이터를 바이트 단위로 바로 전송하지 않고 버퍼라는 임시 저장공간에 저장을 하여
일정 데이터가 쌓였을 때 한 번에 전송하면 전송속도가 빠르다.

File 클래스

파일을 자바의 객체로 다룰 수 있게 해주는 클래스
외부에 파일을 만들거나 외부 파일을 가져올 때 그 파일을 File타입 객체로 만들어서 사용한다.	

파일 입출력

- Writer(출력)
	- BufferedWriter : 버퍼를 사용한 출력 클래스
	- FileWriter : 전달한 경로의 파일을 출력하기 위한 목적으로 열어준다.
	전달한 경로에 파일이 없다면 새롭게 만든 후 열어준다.
	- File 
- Reader(입력)
	- BufferedReader : 버퍼를 사용한 입력 클래스
	- FileReader : 전달한 경로의 파일을 입력하기 위한 목적으로 열어준다.
	전달한 경로에 파일이 없다면 FileNotFoundException 예외가 발생한다.
	- File
profile
Slowly but surely

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

아주 유익한 내용이네요!

답글 달기

관련 채용 정보