Java day 19

유요한·2022년 4월 11일
0

자바

목록 보기
21/24

Thread

● 프로세스
	○ 실행된 프로그램
	○ 운영체제로부터 시스템 자원을 할당 받는 작업의 단위
	○ 자바 프로그램은 운영체제 대신 JVM에 의해 자원을 할당 받는다.
● Thread(쓰레드)
	○ 프로세스 내에서 자원을 할당받아 처리를 독립적으로 수행하는 것
	○ 프로세스의 특정한 수행 경로
	○ 프로그램의 처리 경로
	○ 프로그램의 흐름
● 싱글 쓰레드
	○ 프로세그에 한개의 쓰레드를 가지고 있는 것
● 멀티쓰레드
	○ 여러개의 경로를 가질 수 있게 한다.
	○ 한개의 처리 경로를 여러개로 나누어 동시 작업이 가능해진다.
	○ 웹 페이지(JSP)가 대표적인 멀티 쓰레드 응용 프로그램이다.
	○ 하나의 프로세스를 동시에 처리하는 것처럼 보이지만 사실은 매우 짧은 단위로 분할 해서 차례로 처리한다.
● 쓰레딩
	○ 쓰레드가 처리중인 상태를 나타내는 말
	// 1. 쓰레드를 상속 받은 클래스를 만들어 사용하는 방법
class MyThread extends Thread {
	// Thread 클래스의 반드시 run() 오버라이딩한다.
	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("MyThread A - " + i);
		}
	}
	
	
}

// 2. Runnable 인터페이스를 구현해서 쓰레드를 사용하는 방법
// 상속받을게 있을 때는 2번을 사용한다.
// implements로 받아오기 때문에 상속을 받을 수 있다.
class RunnableThread implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("RunnableThread - " + i);
		}		
	}
	
}

public class ThreadExam {
	public static void main(String[] args) {
		MyThread t1 = new MyThread();
		
		// 두번째 방법에서는 쓰레드를 클래스에 Runnable 클래스를 매개변수를 넣어야 한다.
		RunnableThread runable = new RunnableThread();
		Thread t2 = new Thread(runable);
		
		// t1.run();  이렇게는 안된다.
		System.out.println("메인 쓰레드 시작");
		t1.start();
		t2.start();
		System.out.println("메인 쓰레드 종료");
	}
}

Thread 사용 이유

● 운영체제는 시스템 작업을 효율적으로 관리하기 위해 쓰레드를 이용한다.
  즉, 멀티 프로세스로 실행되는 작업을 멀티 쓰레드로 실행하게 되면 프로세스를
  생성하여 자원을 할당하는 과정도 줄어들 뿐더러 프로세스를 컨텍스트 스위칭하는 것보다
  오버헤드를 더 줄일 수 있게 된다.

멀티 쓰레드의 장단점

장점

	● CPU의 사용률을 향상시킨다. 즉, 많은 처리를 한꺼번에 할 수 있다.
    ● 많은 처리를 하므로 자원을 보다 효율적으로 사용할 수 있다.
    ● 사용자에 대한 응답성이 향상된다.
    

단점

● 개발자의 개발 난이도가 비교적 높고, 유지보수가 어렵다.
● 오류가 발생하면 어디에서 발생하는지 알 수 없다.

교착상태

멀티 쓰레드 중 쓰레드간의 대기상태가 종료되지 않아서
무한정 대기만 하는 비정상적인 상태
제어문을 통해 교착상태를 파악하고 다시 깨워준다.

스트림

입력 또는 출력의 흐름을 제어/통제하기 위해 운영체제에 의해 생성되는
가상의 연결고리(중간 매개자) 역할을 한다.

파일 입출력(스트림)

파일에서 데이터를 읽거나 저장하는데 사용하는 기본적인 스트림

표준 입출력

일반적으로 키보드를 통해 입력을 받고, 모니터를 통해 출력을 한다.

입력스트림

	FileInputStream         		파일 입력 스트림
   	ByteArrayInputStream      		메모리 입력 스트림
   	PipedInputStream      			프로세스 입력 스트림
   	AudioInputStream      			오디오 장치 입력 스트림
		import java.io.FileInputStream;
		

public class FileInputStreamExam {
	public static void main(String[] args) throws Exception {
		// 파일입출력스트림 방식은 한글과 중국어의 2바이트 이상의 문자들은 깨지는 문제가 있다.
		FileInputStream fis = new FileInputStream("D:\\java_1900_yohan\\memo\\memo\\file_in.txt");
		
		// 파일에서 맨 앞의 한 글자를 읽고 위치는 다음 글자로 이동한다.
		System.out.println((char)fis.read());		// 첫번째 글자 : 1
		System.out.println((char)fis.read());		// 두번째 글자 : a
		// 세번째 글자 : ? (가 ← 이렇게 나와야는데 한글과 중국어는 1byte라 읽지를 못함)
		System.out.println((char)fis.read());
		
		int data = 0;
		while(data != -1) {	// 파일 문장의 마지막에 가면 -1을 반환한다. 
							// 파일의 마지막에 가면 null이 반환, end of file이라는 값으로 -1 반환
			data = fis.read();
			// while(data != -1) 이것때문에 마지막에 ?가 뜨는데 if(data != -1)로 방어코드를 작성해서
			// 마지막 것까지 출력
			if(data != -1) {
			System.out.println((char)data);
		}
		}	
		fis.close();
		System.out.println("파일 읽기 종료");
		
		// 파일 출력
		FileOutputStream fos = new FileOutputStream("D:\\java_1900_yohan\\memo\\memo\\file_out.txt");
	
		//  해당 파일에 한글자를 쓰고 다음 위치로 이동
		fos.write('1');
		fos.write('2');
		fos.write('\n');
		fos.write('3');
		
		fos.close();
		System.out.println("파일 쓰기 종료");
	
	}
}

출력스트림

	FileOutputStream      		파일 출력 스트림
   	ByteArrayOutputStream      	메모리 출력 스트림
   	PipedOutputStream      		프로세스 출력 스트림
   	AudioOutputStream      		오디오 장치 출력 스트림
		import java.io.FileOutputStream;
		public class FileInputStreamExam {
	public static void main(String[] args) throws Exception {
		// 파일입출력스트림 방식은 한글과 중국어의 2바이트 이상의 문자들은 깨지는 문제가 있다.
       
       // 파일 출력
		FileOutputStream fos = new FileOutputStream("D:\\java_1900_yohan\\memo\\memo\\file_out.txt");
	
		//  해당 파일에 한글자를 쓰고 다음 위치로 이동
		fos.write('1');
		fos.write('2');
		fos.write('\n');
		fos.write('3');
		
		fos.close();
		System.out.println("파일 쓰기 종료");
	
	}
}

파일 입출력

파일 입출력

파일을 통해 데이터를 입력(로드) 받거나 출력(저장)하는 행위
외부파일에서 스트림을 타고 자바 프로그램으로 들어오는데 그냥 들어오는 것이
아니라 중간에 Buffer에서 심사를 한다. Buffer에서 쌓이다가 일정 시간혹은 일정 용량이
되면 자바 프로그램에 보내져서 하나의 파일이 된다. 데이터들을 보내는주는 작업을
flush라고 한다.

	Java 프로그램(부산) ← Buffer(휴개소)  ←--------스트림(고속도로)---------- 외부파일(서울)

입출력 기본 메소드

	● read()   	데이터를 읽어들일때 사용하는 메소드
    ● write()   데이터를 출력할때 사용하는 메소드
    

wirte()

	● FileWriter 코드를 이용하여 파일을 찾고 BufferedWriter를 이용해 buffer를 시킨뒤 
      close나 flush를 이용하여 파일에 입력한다.
	
    ● FileWriter
		경로에 있는 파일을 준비시키기(쓰기 위해)
		파일이 없는 경우에는 그 이름대로 파일을 생성한다.
		하지만 경로가 이상한 경우(폴더가 잘못된 폴더인 경우) 폴더를 생성해 주지는 않고, 
        예외가 발생한다.
	● new FileWriter("파일경로/파일명.확장자") : 덮어쓰기 모드
	● new FileWriter("파일경로/파일명.확장자", true) : 추가하기 모드
	● BufferedWriter : 버퍼를 이용해서 파일 작성
	● .write("문자열") : 버퍼에 문자열 쓰기
	● .close() : 파일에 적용/ 버퍼에 있는 데이터들을 파일에 써주면서 버퍼 닫기.
		import java.io.BufferedReader;
		import java.io.FileReader;
		import java.io.FileWriter;
		import java.nio.charset.Charset;

public class FileReaderExam {
	public static void main(String[] args) throws Exception {
  		// 출력
		FileWriter fw = new FileWriter("D:\\java_1900_yohan\\memo\\memo\\file_out.txt", Charset.forName("UTF-8"));
		fw.write("안녕하세요.\n");
		fw.write("Hello");
		fw.close();
	}
}
	import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class WriterTest {
	public static void main(String[] args) {
//		경로가 이상한 경우 에러를 발생 시킬 수 있기 때문에 trycatch문으로 만든다.
		try {
//			FileWriter fw = new FileWriter("text.txt");
			FileWriter fw = new FileWriter("text.txt", true);
//			파일을 쓸 준비가 완료되었으면 버퍼를 만들어 세팅해준다.
			BufferedWriter bw = new BufferedWriter(fw);
//			버퍼객체를 만들고 다음 파일에 무엇을 쓸지 작성한다.
//			bw.write("아무거나 작성해도 써진다.");
//			이어쓰기 하려면 FileWriter의 옵션을 true로 해야한다. 
			bw.write("\n아무거나 작성해도 써진다.");
//			작성완료 하였으면 close해서 버퍼를 완료한다.
			bw.close();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}			
						
	}
}
profile
최선을 다하자!!

0개의 댓글

관련 채용 정보