프로그래밍/Java 정리

Java 14일차 - Thread, 파일 입출력

윤도ri 2021. 12. 3. 23:14

>Thread(쓰레드)

 

>>프로세스

- 실행된 프로그램 

- 운영체제로부터 시스템 자원을 할당받는 작업의 단위 

:  자바 프로그램은 운영체제 대신 JVM에 의해 자원을 할당받는다.

 

>>쓰레드

-프로세스의 특정한 수행 경로/프로그램의 처리 경로 /프로그램의 흐름

(main메소드가 실행되면 main thread가생성되고 직접 안에있는 내용을 처리해준다)

-쓰레드는 단일 쓰레드와 멀티 쓰레드가 있다. 

단일 쓰레드는 C 를 수행하기까지 시간이 많이 걸린다. 그에 비해 멀티 쓰레드는 a1초 b1초 c 1초 이렇게 진행되기 때문에 더 여러개로 나누어 동시 작업기 가능해준디ㅏ.

>>멀티 쓰레드

-하나의 프로세스를 동시에 처리하는 것처럼 보이지만  사실은 매우 짧은 당위로 분할해서 차례대로 처리한다.
 : 여러개의 경로를 가질 수 있게 한다.
 :한개의 처리경로를 여러개로 나누어 동시 작업이 가능해진다.

-웹 페이지(JSP)가 대표적인 멀티 쓰레드 응용 프로그램이다. 

<장점>

1. 효율성 증가
2. 처리량 증가
3. 처리비용 감소 

 

<단점>

1. 복잡하고 설계가 어려움
2. 자원의 공유문제
3. 교착상태(Deadlock)

 

*교착 상태란?

:멀티 쓰레드 중 쓰레드 간의 대기 상태가 종료되지 않아서 무한정 대기만 하는 비정상적인 상태 

 

Solution>> 제어문을 통해 교착상태를 판단하고 다시 깨워준다.

 

>>쓰레드 생성 두가지 방법

 1. Thread 클래스 상속

 2. Runnable 인터페이스 지정 후 Thread 객체에 넘겨주기 (더 선호)

 Runnable 이랑 Thread 둘 다 run( ) 이라는 메소드를 갖고있다. 그래서 불러오면 그 메소드를 실행시켜준다.

우리가 반복해서 출력할건데 시간의 간격을 두고 여러번 출력하고 싶을때 run을 재정의하여 시간초를 설정할 수 있는 메소들 써주면 된다.

<멀티 쓰레드를 적절한 속도로 출력할때>

1.객체에 담아 thread 객체에 넘겨주기 

2.Start( ) 메소드 쓰기 

:완성된 쓰레드를 컴퓨터에 넘겨주며 스케쥴링 시키는 메소드
(스케쥴링 되어야 멀티쓰레드로 쓸 수 있다)

3.join( ) 메소드 쓰기

:다른 쓰레드들을 본인이 완료될때까지 잠시 멈춰두는 역할을 한다.

*마지막에 try ,catch로 쓰레드의 예외를 잡아준다.

 

main에서 쓰레드가 있기때문에 syso 쓸때 중간에 나올수도 있음 그래서 join으로 막아둔것이다.

 

 

>>동기화(synchronized)

-하나의 쓰레드가 실행 중일 때 다른 쓰레드가 동시에 같은 필드를 사용하지 못하도록 막는것 

             

            synchronized(this){
                 //다른 쓰레드가 동시에 접근 불가 
                      }

예제1. 두개의 쓰레드를 사용하면서

돈 10000원을 1000원씩 빼려고 한다. 

-----------------------------------------------------------------------------------------------------------------

>파일 입출력

자바가 외부파일을 읽을때 FOREVER을 읽어오는것이 아니라 1010101숫자로 이루어진 데이터를 가져온다둘은 스트림으로 이어져 있는데 데이터를 저장하는 임시저장소인 Buffer가 이 처리를 더 쉽게 해준다. 이때 bit단위로 갖고와서 flusing 을 하여 전달해준다.&nbsp; flusing 이란 남아있는 데이터를 전달하고 buffer를 전달하는 것을 의미한다. flush 자체가 씻어내리다의 의미가 있어서 사용하는것 같다.&nbsp; 또한 여기서 흥미로운것은 우리가 하는 buffering도 이것과 관련이 있다. 버퍼에 데이터가 다 모아지지 않은상태에서 일정 시간이 지나면 flusing이 되면서 계속 로딩되는 것을 보게되는데 그게 바로 버퍼링이다. 그래서 보통 인터넷에 버퍼링이 심한것은 거의 네트워크에 문제가 생겨서의 가능성이 크다고 한다... kt 부들부들

 1. Writer(입력) 

        FileWriter   >     BufferedWriter    > 파일에 입력

  

1)FileWriter 

-경로에 있는 파일을 가져오는 클래스(쓰기 위해)

  *파일이 없는 경우에는 그 이름대로 파일을 생성해준다. 
  *하지만 경로가 이상한 경우에는(폴더가 잘못된 폴더인 경우) 폴더를 생성해 주지는 않고, 예외가 발생한다.

  ---> 보통 경로가 맞아도 예외를 무조건 try catch 로 잡아주게 된다.

        (=IOException 라는 예외 ) 

 

      new FileWriter("파일경로") :    덮어쓰기 모드
      new FileWriter("파일경로",true) :    추가 모드

 

예제. text.txt 만들면서 내용 써보기(추가해보기)

1.가져오기(new만들기) 2.파일 작성 준비하기 3. 쓰기 3.닫기(닫으며 저장됨) *try, catch 로 예외잡기

 

2)BufferedWriter

-버퍼를 이용해서 파일을 작성하기 위해 쓰는 클래스 : 덮어쓰기 모드

 

<과정>

(1)BufferedWriter bf = new BufferedWriter ( new FileWriter("파일 경로"));

(2)bf. write(" 문자열 ");    <-------버퍼에 문자열 쓰기

(3)bf.close( ); <-------------------- 실제 파일에 적용 

   (버퍼에 있는 데이터들을 파일에 써주면서 버퍼 닫기) 

 

2. Reader(출력)

        FileReader > BuferedReader > 파일에서 출력

 

1)FileReader 

-경로에 있는 파일 가져오는 클래스(읽기 위해)

 

* 이 경우에는 두가지 예외가 발생할 수 있음. 

-FileNotFoundException  

  : 파일을 읽어오는데 파일이 없으면 예외 발생 

-IOException

  : 파일 읽어 오다가 경로 바뀌면 예외 발생 

 

<과정>

(1)BufferedWriter bf = new BufferedWriter ( new FileWriter("파일 경로"));

(2)객체명.readLine(); 으로 문자열 출력하기(while , if문 사용)

*다시 처음부터 읽고 싶다면 재정의하기 

(3)두가지 예외처리하기(try, catch 사용)

 

 

 

 

예제. test.txt 파일 읽어보기