전체 글

초보 개발자의 지식 공유의 장
interrupt() 메소드를 이용하여 스레드를 정지시키기 스레드는 자신의 run() 메소드가 모두 실행되면 자동적으로 종료된다. 하지만 실행중인 스레드를 즉시 종료해야 할 때도 필요하다. (stop() 메소드가 존재하였으나, 종료시 자원들이 불안전한 상태로 남겨지기 때문에 deprecated 되었다.)interrupt() 메소드는 스레드가 일시 정지 상태에 있을 때 InterruptedException 예외를 발생 시킨다.이것을 이용하면 run() 메소드를 정상 종료시킬 수 있다. 스레드가 실행 대기 또는 실행 상태에 있을 때 interrupt() 메소드가 실행되면 즉시 InterruptedException 예외가 발생하지 않고, 스레드가 미래에 일시 정지 상태가 되면 InterruptedExcepti..
스레드간 협업(wait, notify, notifyAll) 경우에 따라 두 스레드가 교대로 번갈아가며 실행해야 할 경우가 있다. (정확한 교대작업이 필요한 경우, 한 스레드가 작업이 끝나며 상대방 스레드의 일시정지를 풀어주고 자신은 일시정지로 만들어야 한다.)공유객체 를 사용하여 두 스레드가 작업할 내용을 각각 동기화 메소드로 구분해 놓은 후 한 스레드가 작업이 완료되면 notify()메서드를 호출한다.notify() => 일시 정지 상태에 있는 다른 스레드를 실행 대기 상태로 만듬 wait() => 스레드를 일시 정지 상태로 만듬위 두 메서드는 Thread 클래스가 아닌 Object 클래스에 선언된 메소드이므로 모든 공유 객체에서 호출이 가능하다. (동기화블록에서만 사용 가능) 스레드 작업 내용을 동기..
네트워크 프로그래밍(TCP 소켓) 스레드 병렬 처리 연결시, ServerSocket의 accept()를 실행하거나, 서버 연결 요청을 위해 Socket 생성자 또는 connect()를 실행할 경우 해당 작업이 완료되기 전까지 블로킹(blocking)된다.데이터 통신시에도 InputStream, OutputStream의 read(), write() 메소드는 작업이 끝날 때 까지 블로킹된다. => 결론적으로 ServerScoket과 Socket은 동기(블로킹) 방식으로 구동된다. 이렇게 동작할때의 문제점은, 서버 애플리케이션은 지속적으로 클라이언트의 연결 수락 기능을 해야하는데, 입출력에서 블로킹되면 이 작업을 할 수 없게된다. 또한 클라이언트1과 입출력하는 동안 클라이언트2와 입출력을 할 수 없게된다. 그..
다른 스레드의 종료를 기다림(join()) 스레드는 다른 스레드와 독립적으로 실행되는 것이 일반적이지만, 다른 스레드가 종료될 때까지 기다리다가 실행되야되는 경우가 발생할 수 있다.예를 들어 B라는 스레드는 계산을하는 스레드이고, A라는 스레드는 B스레드가 계산이 끝나면 그 결과값을 가지고 로직을 처리해야하는 상황이다.이 와같은 상황은 아래와 같은 코드를 이용해 구현할 수 있다.(join() 이용) ThreadA{ threadB.start(); // ThreadB 실행 (실행순서 1) threadB.join(); // 일시정지 ...ThreadA의 로직 수행 ; // (실행순서 3) } ThreadB{ run(){ // ThreadB 작업 실행(실행순서 2) } } ThreadA가 ThreadB의 joi..
스레드 상태제어 스레드를 일시정지 상태로 만들거나, 정지된 스레드를 다시 실행시키거나 하는 행위 즉, 실행 중인 스레드의 상태 변경하는 것을 스레드 상태 제어라고 한다.몇 가지 스레드 상태 제어 함수를 알아보자다른 스레드에게 실행 양보(yield())스레드 실행 양보 예제ThreadA 정의 public class ThreadA extends Thread{ public boolean stop = false; // 종료 플래그 public boolean work = true; // 작업 진행 여부 플래 public void run() { while(!stop) { if(work) { System.out.println("ThreadA가 작업중입니다."); }else { Thread.yield(); // wor..
스레드 상태 처음에 start() 메소드를 호출하면 곧바로 스레드가 실행되는 것처럼 보이지만 사실은 실행 대기 상태가 된다. 스레드 스케줄링으로 선택된 스레드가 비로서 CPU를 점유하고 run()메소드를 실행한다. => 실행(Running)상태 상태열거 상수설명 객체 생성NEW스레드 객체가 생성, 아직 start() 메소드가 호출되지 않음실행 대기RUNNABLE실행 상태로 언제든지 갈 수 있는 상태일시 정지WAITING다른 스레드가 통지할 때까지 기다리는 상태일시 정지TIMED_WAITING주어진 시간 동안 기다리는 상태일시 정지BLOCKED사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태종료TERMINATED실행을 마친 상태 예제 코드 public class StatePrintThread exte..
동기화 메소드와 동기화 블록 공유 객체를 사용할 때 주의할 점멀티 스레드 프로그램에서는 스레드들이 객체를 공유해서 작업해야 하는 경우가 있다.이 경우, 스레드 A를 사용하던 객체가 스레드 B에 의해 상태가 변경될 수 있기 때문에 스레드 A가 의도했던 것과는 다른 결과를 산출할 수도 있다. public class User1 extends Thread{ private Calculator calculator; @Override public void run() { calculator.setmemory(100); } public void setCalculator(Calculator calculator) { this.setName("User1"); this.calculator = calculator; } } pub..
Convert with Plain Java(String을 InputStream으로 변환) public void convertToStreamTest(){ String text = "test"; InputStream is = new ByteArrayInputStream(text.getBytes()); } 문자열을 Byte Array로 변환 후, ByteArrayInputStream을 사용하여 InputStream으로 변환한다.
7.5 함수를 이용해서 치환하기 정규표현식을 replace의 첫 번째 인자로 전달하면 단순히 고정된 문자열이 아니라 패턴에 일치하는 부분을 하나 치환한다. replace()의 강력한 기능은 고정된 문자열 대신 함수를 치환할 값으로 제공할 수 있다는 점 이다.두 번째 인자로 함수를 넘길 경우, 일치하는 부분을 찾을 때마다 다음과 같은 일련의 매개변수를 가지고 호출이 된다. 매치되는 전체 문자열 해당 매치 내에 포함된 캡처들(캡처는 배열이 아니라 각각 하나의 매개변수로 전달됨) 원본 문자열에서 매치되는 부분의 위치(index) 원본 문자열 예제) replace 사용 function upper(all, letter){return letter.toUpperCase();} // 대문자변환 console.log("..
프로세스와 스레드 멀티 프로세스들은 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다.멀티 스레드는 하나의 프로세스 내부에 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에게 영향을 미치게 된다. 그렇기 때문에 멀티 스레드에서는 예외처리에 만전을 기해야 한다. 작업 스레드 생성과 실행 Thread 클래스로부터 직접 생성 Runnable 인터페이스를 구현하여 사용(아래예제를 참고 3가지 방법이 존재) public class BeepPrintExample2 { public static void main(String[] args){ // 쓰레드가 동작 Runnable beepTask = new BeepTask(); Thread threa..
깡냉쓰
평범한 개발자 노트