JAVA/Thread
Java Thread 대표 메서드 소개 및 특징 정리
처음 입사 후 담당했던 프로젝트의 경우 단일 스레드로 동작하며, 동작 필요에 따라 Thread를 만들어주고 UI에 Lock 걸리는 것을 방지하기 위해 UI Thread 처리도 별도로 해주어야 했다. 그래서 Thread에 대해 많이 익숙 했었다. 하지만 Web 프로젝트를 진행하면서 Container에서 기본적으로 Multi-Thread를 지원해주기 때문에 동기화 처리를 제외하고는 그렇게 크게 Multi-Thread에 대해 처리를 해줄 필요가 없게 되었다. 핑계일 수 있지만 이러한 이유로 많이 잊어먹은 Thread에 대해 다시한번 정리해보았다. Thread 실행 Thread에서 start를 해야한다. start()메소드는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(공간)을 생성한 다음 run()을 호..
synchronous vs asynchronous
synchronous vs asynchronoussystem call의 완료를 기다리면 synchronoussystem call의 완료를 기다리지 않으면 asynchronoussynchronous vs blocking시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수가 아니면 synchronous시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수이면 blocking
멀티 스레드
멀티 쓰레딩의 장점- CPU의 사용률을 향상시킨다.- 자원을 보다 효율적으로 사용할 수 있다.- 사용자에 대한 응답성이 향상된다.- 작업이 분리되어 코드가 간결해진다. Thread 클래스 vs Runnable 인터페이스Thread 클래스를 사용하는 방법과 Runnable 인터페이스를 구현하는 방법 두가지가 있다.- Thread클래스를 상속받으면 다른 상속이 불가능 하기에 대체로 Runnable인터페이스를 사용한다. - Runnable 인터페이스를 구현하는 방법이 재사용성이 높고 코드의 일관성을 유지할 수 있는 장점이 있다.- Runnable 인터페이스는 run()메서드만 정의되어있는 간단한 인터페이스이다.- Thread 클래스를 상속받으면, Thread 클래스의 메소드를 직접 호출할 수 있지만 .Runn..
쓰레드 개념정리
쓰레드의 스케줄링과 관련된 메서드void interrupt() : sleep()이나 join()에 의해 일시정지상태인 쓰레드를 실행대기 상태로 만든다.void join(), join(long millis) : 지정된 시간동안 쓰레드가 실행되도록 한다. / 해당 쓰레드가 종료될때 까지 main 쓰레드는 대기한다.void resume() : suspend()에 의해 일시정지상태에 있는 쓰레드를 실행대기상태로 만든다.static void sleep(long miillis) : 지정된 시간 동안 쓰레드를 일시정지 시킨다. 시간이 지난후 다시 실행대기상태가 된다.void stop() : .쓰레드를 즉시 종료신킨다.void suspend() : 쓰레드를 일시정지 시킨다.static void yield() : 실행중..
JAVA 데몬 스레드 소개
데몬 쓰레드는 다른 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 쓰레드이다. boolean isDeaemon() 쓰레드가 daemon 쓰레드 인지 확인void setDaemon(boolean on) 쓰레드를 데몬 쓰레드로 또는 사용자 쓰레드로 변경한다. 자동저장 쓰레드 프로그래밍 package javas; import javax.swing.JOptionPane; public class Thread1 { static boolean autoSave = false; public static void main(String args[]) { Runnable r = new Thread_1(); Thread t1 = new Thread(r); t1.setDaemon(true); t1.start(); for (..
synchronized 쓰레드 예제 프로그래밍
문제의 프로그램package javas; import javax.swing.JOptionPane; public class Thread1 { public static void main(String args[]) { Runnable r = new RunnableEX(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); }} class Account{ int balance = 1000; public void withdraw(int money){ if(balance >= money){ try{ Thread.sleep(1000);} catch (Exception e){ } balance -= money; } }} class..
Thread wait(), notify() 소개
문제점하나의 쓰레드가 객체에 lock 을 걸고 어떤 조건이 만족될 때까지 기다려야 하는 경우, 이 쓰레드를 그대로 놔두면 이 객체를 사용하려는 다른 쓰레드들은 lock이 풀릴 때 까지 같이 기다려야 하는 상황이 발생 해결책 이런 비효율을 개선하기 위해서 wait()와 notify()를 사용한다. 한 쓰레드가 객체에 lock을 걸고 오래 기다리는 대신 wait()을 호출해서 다른 쓰레드에게 제어권을 넘겨주고 대기상태로 기다리다가 다른 쓰레드에 의해서 notify() 가 호출 되면 다시 실행 상태가 되도록 하는 것이다. wait(), notify(), notifyAll()- object 클래스에 정의된 메소드이므로 모든 객체에서 호출이 가능하다.- 동기화 블록(synchronized블록) 내에서만 사용이 가..
Thread 크리티컬 세션
쓰레드가 같은 부분을 공유하여 멀티프로세스보다 훨씬 좋은 장점을 가지고 있다 그러나 그 만큼 같은 부분을 공유하기 때문에 문제가 생기는 경우가 있다. 그래서 해당 쓰레드가 그 부분을 사용하고 있다면 다른 쓰레드가 접근할 수 없도록 하는 동기화 작업이 필요하다. Log를 남기는 작업을 하는 프로그램을 살펴보자 import java.io.*;import java.util.*; public class LogFile{private Writer out; public LogFile(File f) throws IOException{ FileWriter fw = new FileWriter(f); this.out = new VufferedWriter(fw);} public void writeEntry(String mes..
java thread pool 소개
스레드 풀Public class GzipRunnable implements Runnable { Private final File input; Public GZipRunnable(File input) {This.input = intpu;} @OverridePulbic void run(){ if (!input.getName().endsWith(".gz")) {File output = new File(input.getParent(), input.getName() + ".gz");If(!output.exists) {Try (InputStream in = new BufferedInputStream(new FileInputStream(input));OutPutStream out = new BufferedOutput..
JAVA 스레드 스케줄링
스레드 스케줄링 # 스레드 스케줄링에는 크게 선점형과 협력형 두 가지가 있다. 선점형 스레드 스케줄러- 선점형 스레드 스케줄러는 스레드에게 공평하게 분배된 CPU 시간이 소진되었을 때, 스레드를 중지시키고 다른 스레드에게 CPU 제어권을 넘겨주는 일을 결정한다. 협력형 스레드 스케줄러- 협력형 스레드 스케줄러는 CPU 제어권을 다른 스레드에게 넘겨주기 전에 실행 중인 스레드가 스스로 실행을 중단 할때 까지 기다린다.- 협력형은 기아현상이 일어 날 수 있다. 모든 자바 가상머신은 우선순위에 따른 선점형 스레드 스케줄링 방식의 사용이보장된다.(선점형 스레드는 우선순위가 높은 스레드를 먼저 실행시키는 등의 문제로 인해 다른 스레드들은 기아현상에빠질 수도 있다. 잘 사용해야 한다.)-> 우선순위가 높은 스레드들..