티스토리

머리는 나쁘지만 공부가 취미입니다
검색하기

블로그 홈

머리는 나쁘지만 공부가 취미입니다

IT 분야 크리에이터
nozeroslope.tistory.com/m

nozeroslope 님의 블로그입니다.

구독자
16
방명록 방문하기

주요 글 목록

  • 멀티 스레드(9) - 스레드 풀 4 : 블로킹 방식의 작업 완료 통보 1 작업 완료 통보는 블로킹 방식과 콜백 방식으로 나뉩니다. 우선, 블로킹 방식에 대해서 먼저 살펴보도록 하겠습니다.  ExecutorService의 submit( ) 메서드는 매개값으로 준 Runnable 또는 Callable 작업을 스레드풀의 작업 큐에 저장하고 즉시 Future 객체를 리턴하게 됩니다.  리턴 타입메서드명(파라미터)설명Futuresubmit(Runnable task)- Runnable 또는 Callable을 작업 큐에 저장- 리턴된 Future를 통해 작업 처리 결과를 얻음 Future submit(Runnable task, V resutl) Future submit(Callable task)  여기서 Future 객체는 작업 결과가 아니라, 작업이 완료될 때까지 기다렸다가(=지연, 즉.. 공감수 1 댓글수 0 2025. 1. 15.
  • 멀티 스레드(9) - 스레드 풀 3 : 작업 생성과 처리 요청 2 앞선 아티클에서 살펴본 작업처리 요청과 관련된 자세한 내용을 더 살펴보겠습니다.    멀티 스레드(9) - 스레드 풀 3 : 작업 생성과 처리 요청 1○ 작업 생성 하나의 작업은 Runnable 또는 Callable 구현 클래스로 표현하게 됩니다. 두 구현 클래스의 차이는 리턴 값 유무의 여부인데, 아래 예시를 살펴보겠습니다.  Runnable 구현 클래스Callablenozeroslope.tistory.com  작업 처리 요청은, ExecutorService의 작업 큐에 Runnable 또는 Callable 객체를 넣는 행위를 의미합니다. ExecutorService는 작업 처리 요청을 위해 당므 두 가지 종류의 메서드를 제공합니다.  리턴 타입메서드 명(파라미터)설명voidexecute(Runnabl.. 공감수 1 댓글수 0 2025. 1. 13.
  • 멀티 스레드(9) - 스레드 풀 3 : 작업 생성과 처리 요청 1 ○ 작업 생성 하나의 작업은 Runnable 또는 Callable 구현 클래스로 표현하게 됩니다. 두 구현 클래스의 차이는 리턴 값 유무의 여부인데, 아래 예시를 살펴보겠습니다.  Runnable 구현 클래스Callable 구현 클래스Runnable task = new Runnable( ) {    @Override    public void run( ) {        // 스레드가 처리할 내용    }}Callable task = new Callable)( ) {    @Override    public T call( ) throws Exception {        // 스레드가 처리할 내용        return T;    }} Runnable의 run( ) 메서드는 리턴값이 없고, Callab.. 공감수 0 댓글수 0 2025. 1. 12.
  • 멀티 스레드(9) - 스레드 풀 2 : 스레드 풀 생성 및 종료 3 ○ 스레드풀의 종료 스레드풀의 스레드는 기본적으로 데몬 스레드가 아니기에, main 스레드가 종료되더라도 작업을 처리하기 위해 계속 실행 상태를 유지하게 됩니다. 그래서 main( ) 메서드 실행이 끝나도 애플리케이션 프로세스가 종료되지 않습니다. 종료를 위해서는 스레드풀을 종료시켜 스레드들이 종료 상태가 되도록 처리해야 합니다.  ExecutorService는 종료와 관련해, 다음 세 개의 메서드를 제공합니다.  리턴 타입메서드명(파라미터)설명voidshutdown( )현재 처리 중인 작업뿐만 아니라 작업 큐에 대기하고 있는 모든 작업을 처리한 뒤에 스레드폴을 종료한다.ListshutdownNow( )현재 작업 처리 중인 스레드를 interrupt해서 작업 중지를 시도하고, 스레드풀을 종료시킨다. 리턴.. 공감수 0 댓글수 0 2025. 1. 10.
  • 멀티 스레드(9) - 스레드 풀 2 : 스레드 풀 생성 및 종료 2 앞선 아티클에서 newCachedThreadPool( )로 생성한 스레드 풀에 대해서 살펴보았습니다. 이번에는 newFixedThreadPool(int nThreads)의 사용에 대해서 살펴보겠습니다.    멀티 스레드(9) - 스레드 풀 2 : 스레드 풀 생성 및 종료 1○ 스레드풀 생성 앞선 스레드풀 개념에서 설명했듯이, ExecutorService 인터페이스의 구현 객체는 Executors 클래스의 static 메서드를 이용해 생성하게 됩니다. 아래 두 가지 메서드 중 하나를 사용하nozeroslope.tistory.com    newFixedThreadPool(int nThreads) 메서드로 생성된 스레드풀의 초기 스레드 개수는 역시 0개 입니다. 그리고 코어 스레드 수는 nThreads입니다... 공감수 2 댓글수 0 2025. 1. 8.
  • 멀티 스레드(9) - 스레드 풀 2 : 스레드 풀 생성 및 종료 1 ○ 스레드풀 생성 앞선 스레드풀 개념에서 설명했듯이, ExecutorService 인터페이스의 구현 객체는 Executors 클래스의 static 메서드를 이용해 생성하게 됩니다. 아래 두 가지 메서드 중 하나를 사용하게 됩니다.  메서드명(파라미터)초기 스레드 수코어 스레드 수최대 스레드 수newCachedThreadPool( )00Integer.MAX_VALUEnewFixedThreadPool(int nThreads)0nThreadsnThreads  * 초기 스레드 수 : ExecutorService 객체가 생성될 때 기본적으로 생성되는 스레드 수를 의미 * 코어 스레드 수 : 스레드 수 증가 후, 사용하지 않는 스레드를 스레드 풀에서 제거할 때 최소한으로 유지해야 할 스레드 수 * 최대 스레드 수 .. 공감수 0 댓글수 2 2025. 1. 7.
  • 멀티 스레드(9) - 스레드 풀 1 : 스레드 풀의 정의 스레드를 활용한 병렬 작업이 증가하게 되면, 어플리케이션 성능이 저하될 수 밖에 없습니다. 스레드 생성과 스케줄링으로 인해서 CPU 사용량이 늘어나고, 메모리의 사용량이 늘어나기 때문입니다. 그래서 스레드 사용의 폭증을 막기 위해서 스레드 풀(Thread Pool)을 사용하게 됩니다.  스레드 풀은,  - 작업 처리에 사용되는 스레드 최대 개수를 제한해 놓고 - 작업 큐(Queue)에 들어온 작업들을, 각각의 스레드가 하나씩 맡아서 처리합니다. - 할당 작업 처리가 끝난 스레드는, 다시 작업 큐에서 새로운 작업을 가져와 처리합니다. 이런 구조이기 때문에, 만약에 작업 요청이 갑작스럽게 폭증한다고 해도, 스레드의 개수는 정해져있기 때문에 스레드 증가로 인한 어플리케이션 성능 저하가 발생하지 않는 것입니다... 공감수 0 댓글수 0 2025. 1. 5.
  • 멀티 스레드(8) - 스레드 그룹 5 앞선 아티클에서 ThreadGroup 메서드를 살펴보았습니다. 이제 이 내용을 기반으로 예제를 작성해 보겠습니다.    멀티 스레드(8) - 스레드 그룹 4앞선 아티클에서 우리는 스레드 그룹 생성 기능을 살펴보았습니다.    멀티 스레드(8) - 스레드 그룹 3스레드 그룹을 명시적으로 선언하는 방법도 있습니다. ThreadGroup 생성자를 이용해서 객체nozeroslope.tistory.com  아래 예제에서 스레드 그룹을 생성하고, 정보를 출력한 다음 3초 후 스레드 그룹의 interrupt( ) 메서드를 호출하여 스레드 그룹에 포함된 모든 스레드를 일괄 종료시킵니다. 여기서는 Thread 클래스의 생성자도 중요하게 사용되니 다시 확인합니다.   멀티 스레드(8) - 스레드 그룹 3스레드 그룹을 명시.. 공감수 1 댓글수 2 2025. 1. 2.
  • 멀티 스레드(8) - 스레드 그룹 4 앞선 아티클에서 우리는 스레드 그룹 생성 기능을 살펴보았습니다.    멀티 스레드(8) - 스레드 그룹 3스레드 그룹을 명시적으로 선언하는 방법도 있습니다. ThreadGroup 생성자를 이용해서 객체를 생성하는 방식입니다. 이 때 생성자에서 ThreadGroup의 이름만 파라미터로 줄 수 있고, 부모 ThreadGroup과nozeroslope.tistory.com  당연한 의문인데, 이러한 스레드 그룹을 사용했을 때의 장점은 무엇이 있을까요? '그룹'으로 묶여있으니, 당연한 이야기지만 그룹을 일괄적으로 컨트롤이 가능하다는 장점이 있겠죠.  대표적인 예시가 interrupt( )입니다. ThreadGroup에서 제공하는 interrupt( ) 메서드를 사용하면, 그룹 내에 포함된 모든 스레드들을 일괄적으.. 공감수 0 댓글수 0 2024. 12. 30.
  • 멀티 스레드(8) - 스레드 그룹 3 스레드 그룹을 명시적으로 선언하는 방법도 있습니다. ThreadGroup 생성자를 이용해서 객체를 생성하는 방식입니다. 이 때 생성자에서 ThreadGroup의 이름만 파라미터로 줄 수 있고, 부모 ThreadGroup과 이름까지 함께 파라미터로 전달이 가능합니다.  ThreadGroup tg = new ThreadGroup(String name);ThreadGroup tg = new ThreadGroup(ThreadGroup parent, String name); 두 번째 생성자처럼 스레드 그룹 생성 시에 부모(parent) 스레드 그룹을 별도로 지정하지 않을 경우, 현재 스레드가 속한 그룹의 하위 그룹으로 생성됩니다. 만일 main 스레드가 ThreadGroup(String name)을 이용해서 새로.. 공감수 0 댓글수 1 2024. 12. 27.
  • 멀티 스레드(8) - 스레드 그룹 2 앞서 살펴본 스레드 그룹 사용 예제를 살펴보도록 하겠습니다.  // 1초 주기로 save() 메서드를 호출하는 데몬 스레드public class AutoSaveThread extends Thread { public void save() { System.out.println("작업 내용 저장"); } @Override public void run() { while(true) { try { Thread.sleep(1000); } catch (InterruptedException e) { break; } save(); } }}  import java.awt.Toolkit;import java.util.Map;import java.util.Set;public class Examp.. 공감수 0 댓글수 1 2024. 12. 23.
  • 멀티 스레드(8) - 스레드 그룹 1 스레드 그룹(ThreadGroup)은 관련된 스레드를 일괄적으로 묶어서 관리할 목적으로 사용됩니다. 기본적으로 JVM이 실행되면 system 스레드 그룹을 만들게되고, JVM 운영에 필요한 스레드들을 system 스레드 그룹에 포함하게 됩니다.  그리고 system의 하위 스레드 그룹으로서 main 스레드 그룹이 생성됩니다. 그리고 '메인 스레드'를 이 main 스레드 그룹에 포함하게 됩니다.  기본적으로 스레드는 반드시 하나의 스레드 그룹에 포함되어야 합니다. 그런데 명시적으로 특정 스레드 그룹에 할당하지 않으면, 기본적으로는 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 됩니다. 우리가 지금까지 생성한 작업 스레드는 대부분 main 스레드가 생성합니다. 그래서 결국 이들은 기본적으로 main 스레.. 공감수 0 댓글수 0 2024. 12. 18.
  • 멀티 스레드(7) - 데몬 스레드 2 앞서 살펴본 데몬 스레드를 확인해볼 수 있는 예제를 살펴보도록 하겠습니다. 아래의 예제는 1초 주기로 save( ) 메서드가 자동 호출되도록 AutoSaveThread를 작성하고, 메인 스레드가 3초 후 종료되면 AutoSaveThread도 같이 종료될 수 있도록 AutoSaveThread를 데몬 스레드로 만들었습니다.  // 1초 주기로 save() 메서드를 호출하는 데몬 스레드public class AutoSaveThread extends Thread { public void save() { System.out.println("작업 내용 저장"); } @Override public void run() { while(true) { try { Thread.sleep(1000); } ca.. 공감수 0 댓글수 0 2024. 12. 17.
  • 멀티 스레드(7) - 데몬 스레드 1 데몬(daemon) 스레드는, 주 스레드의 작업을 돕는 보저 역할을 수행하는 스레드입니다. 사실 이 데몬 스레드 자체의 속성은 일반 스레드와 아주 크게 다르지는 않은데, 주 스레드가 종료되면 강제로 종료된다는 특성을 갖습니다. 말했듯이 주 스레드의 보조 역할을 하는 것이 근본적인 존재 이유이기 때문에, 주 스레드가 종료되면 남아있을 이유가 없는 것이죠. 데몬 스레드가 동작하는 실제 예시를 보면, 워드프로세서의 자도 ㅇ저장 / 미디어 플레이어의 동영상(음악) 재생 / 가비지 컬렉터 등이 있습니다. 이들은 주 스레드(워드, 미디어 플레이어, JVM)가 종료되면 같이 종료됩니다.       스레드를 데몬으로 만들기 위해서는, 주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출해야 합니다. 아래.. 공감수 0 댓글수 0 2024. 12. 16.
  • 멀티 스레드(6) - 스레드 상태 제어 6 : 스레드의 안전한 종료 2 ○ interrupt( ) 메서드를 이용하는 방법 이번에는 interrupt( ) 메서드를 사용해 스레드를 종료하는 방법을 살펴보겠습니다. 우선 interrupt( )의 사용 방법을 요약하면, 이 interrupt( ) 메서드는 어떤 메서드가 일시 정지 상태에 있을 때 InterruptedException 예외를 발생시키고, 이를 통해 run( ) 메서드를 종료시키는 역할을 하게 됩니다.  예를 들어, ThreadA에서 ThreadB의 인스턴스를 생성하고 threadB.start( )를 실행하면 ThreadB에서 run( )이 실행됩니다. 그러다가 ThreadB의 run( ) 메서드 내의 while문 안에서 Thread.sleep(1)이 실행되는 순간 일시정지 상태가 되고, 이 때  ThreadA에서는 .. 공감수 0 댓글수 0 2024. 12. 11.
  • 멀티 스레드(6) - 스레드 상태 제어 6 : 스레드의 안전한 종료 1 지금까지 살펴온 내용을 바탕으로 본다면, 스레드는 기본적으로 run( ) 메서드가 모두 실행되고 나면 자동으로 종료하게 되어 있습니다. 하지만, 경우에 따라 run( ) 메서드가 다 실행되지 않았어도 스레드를 즉시 종료할 필요성이 생기기도 합니다(영상 재생이 안 끝났는데 사용자가 중단하는 경우와 같이). 원래 Thread에서는 이런 즉시 종료를 위한 stop( ) 메서드가 제공되었었는데, 현재는 불안정성으로 인해 deprecated 되었습니다. 이를 제외한 스레드 즉시 중단 방법에 대해서 살펴보겠습니다.   ○ stop 플래그 사용하기 스레드는 run( ) 메서드가 끝남과 동시에 자동으로 종료되므로, run( ) 메서드의 종료를 유도하는 것이 최선입니다. 이 때, stop이라는 플래그를 ㅇ이용해서 run.. 공감수 0 댓글수 1 2024. 12. 10.
  • 멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 3 또 하나의 스레드 간 협업 예제를 작성해 보겠습니다. 조금 복잡하지만 차례차례 읽어보겠습니다.  - 우선 데이터를 저장하는 생산자 스레드가 있습니다. - 이 생산자 스레드는 공유 객체(DataBox)에 데이터를 저장합니다. - 그럼 소비자 스레드에서는 이 데이터를 읽어들입니다. - 이 과정을 순서대로 교대하며 진행하는 작업을 구현해야 합니다. - 단, 제약 사항이 있습니다. 생산자 스레드는 소비자 스레드가 읽기 전에 새 데이터를 두 번 생성 불가합니다.  > setData( ) 메서드 두 번 실행 불가- 동일하게 소비자 스레드도 새로운 데[이터 생성 전에 데이터를 두 번 읽어서도 안됩니다.   > getData( ) 메서드 두 번 실행 불가 구현은 실제로 다음과 같이 진행합니다. 공유 객체(DataBox.. 공감수 0 댓글수 0 2024. 12. 9.
  • 멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 2 앞선 아티클에서 스레드 간 협업을 위한 메서드의 기본적인 사용법을 알아보았습니다. 이번에는 예제를 통해서, 앞선 스레드 간 협업을 위한 메서드 사용을 구체적으로 살펴보겠습니다.      이번 예제에서 두 스레드인 ThreadA와 ThreadB의 작업을 살펴보겠습니다.- 공유객체인 WorkObject에서 두 스레드의 작업을 methodA( ) / methodB( )에 정의합니다.- 두 스레드 ThreadA와 ThreadB가 교대로 methodA( )와 methodB( )를 호출합니다.   // WorkObject.java// 두 스레드의 작업 내용을 동기화 메서드로 작성한 공유 객체public class WorkObject { public synchronized void methodA() { System.. 공감수 2 댓글수 4 2024. 12. 7.
  • 멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 1 ○ 스레드 간 협업( wait( ), notify( ), notifyAll( ) ) 경우에 따라 두 개의 스레드를 번갈아 교대로 실행할 필요성이 생길때가 있습니다. 정확한 교대 규칙이 필요할 경우, 자신의 작업이 끝나면 상대방 스레드를 일시 정지 상태에서 풀고 - 자신은 일시 정지 상태로 만들면 됩니다.  여기서 wait( ) / notify( ) / notifyAll( )이 사용되는데, 설명이 복잡할 수 있으니 메서드 표를 다시 한번 인용해 보겠습니다.      동작메서드설명일시 정지 > 실행 대기interrupt( )일시 정지 상태의 스레드에서 InterruptedException 예외를 발생 시켜, 예외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다.notify.. 공감수 0 댓글수 0 2024. 12. 6.
  • 멀티 스레드(6) - 스레드 상태 제어 4 ○ 다른 스레드의 종료 기다리기( join( ) ) 스레드는 기본적으로 다른 스레드와 독립적으로 실행하는 것이 기본입니다. 하지만, 다른 스레드가 종료될 때까지 기다렸다가 실행해야 하는 경우도 발생할 수 있습니다. 예를 들어 하나의 스레드에서 계산 작업을 진행하고, 다른 스레드에서 이 결과값을 받는 경우가 있죠.  Thread는 이런 상황을 위해 join( ) 메서드를 제공합니다. 간단히 설명하자면, ThreadA에서 ThreadB를 실행하고, ThreadB의 join( )을 실행하면 ThreadA는 ThreadB가 종료될 때 까지 일시 정지 상태가 됩니다. ThreadB의 run( ) 메서드가 종료되어야 비로소 ThreadA는 다시 실행 상태가 됩니다.  ThreadA에서 threadB.start( ).. 공감수 2 댓글수 2 2024. 11. 28.
  • 멀티 스레드(6) - 스레드 상태 제어 3 ○ 다른 스레드에게 실행 양보하기( yield( ) )  스레드 처리 작업은 반복적인 실행 상태 유지를 위하여 for문 또는 while문을 사용하는 경우가 많습니다. 그런데, 이러한 반복문이 무의미하게 반복이 유지되는 경우가 있습니다.  public void run() { while(true) { if(work) { System.out.println("ThreadA 작업 내용"); } }}  위와 같은 while문이 있다고 가정해 보겠습니다. 스레드가 실행되어 run( )이 실행되면, while(true) { } 블록은 무한 반복 실행이 됩니다.  그런데 이 때, work가 true가 아니라 false라면? 그리고 work가 false에서 true 바뀌는 상황이 정.. 공감수 1 댓글수 0 2024. 11. 26.
  • 멀티 스레드(6) - 스레드 상태 제어 2 앞서 스레드 상태를 제어하는 메서드에 대해서 전반적으로 리뷰해 보았습니다. 이번 아티클부터는 해당 메서드를 하나씩 살펴보도록 하겠습니다.    멀티 스레드(6) - 스레드 상태 제어 1[스레드 상태 제어]라는 용어의 개념이 무엇인지부터 쉽게 설명해 보겠습니다. 우리가 미디어 플레이어로 동영상을 재생을 하다보면, 영상을 정지했다가 다시 재생하기도 하고 영상 재생을 종nozeroslope.tistory.com    ○ 주어진 시간동안 일시 정지( sleep( ) ) 기본적인 스레드 상태 제어 정적 메서드인 sleep( )입니다. Thread.sleep( ) 메서드를 호출한 스레드는 파라미터로 전달된 시간동안 일시 정지(TIME_WAITING) 상태가 되고, 다시 실행 대기 상태(RUNNABLE)로 돌아가게 .. 공감수 0 댓글수 1 2024. 11. 25.
  • 멀티 스레드(6) - 스레드 상태 제어 1 [스레드 상태 제어]라는 용어의 개념이 무엇인지부터 쉽게 설명해 보겠습니다. 우리가 미디어 플레이어로 동영상을 재생을 하다보면, 영상을 정지했다가 다시 재생하기도 하고 영상 재생을 종료하기도 합니다. 간단한 동작이지만 이는 '동영상 스레드'를 일시 정지하거나 종료 상태로 만들면서 실행 중인 스레드의 상태를 변경하게 됩니다.  위와 같이 실행 중인 스레드의 상태를 변경하는 것을 [스레드 상태 제어]라고 합니다. 이 스레드 상태 제어는 기본적인 스레드의 상태에 기반해 설명하기 때문에, 앞선 스레드 상태와 관련된 내용을 리뷰해 보시기 바랍니다.    멀티 스레드(5) - 스레드 상태 1스레드 상태에서부터는 내용이 다소 복잡해집니다. 스레드의 실행 과정은 간단해 보였지만(run 메서드 실행), 이 과정에서는 복.. 공감수 0 댓글수 0 2024. 11. 24.
  • 멀티 스레드(5) - 스레드 상태 2 앞서서 스레드의 상태에 대한 열거 상수 리스트까지 살펴보았습니다. 이제 이 내용을 바탕으로, 예제 코드를 작성해 보겠습니다.    멀티 스레드(5) - 스레드 상태 1스레드 상태에서부터는 내용이 다소 복잡해집니다. 스레드의 실행 과정은 간단해 보였지만(run 메서드 실행), 이 과정에서는 복잡한 상태 변동이 일어나기 때문이죠. 차근차근 짚어나가 보겠습nozeroslope.tistory.com  아래의 스레드는 특정 타겟 스레드의 상태를 0.5초 주기로 출력하는 스레드입니다.// StatePrintThread.java// 타겟 스레드의 상태를 출력해주는 스레드public class StatePrintThread extends Thread { private Thread targetThread; // 파라미.. 공감수 2 댓글수 2 2024. 11. 20.
  • 멀티 스레드(5) - 스레드 상태 1 스레드 상태에서부터는 내용이 다소 복잡해집니다. 스레드의 실행 과정은 간단해 보였지만(run 메서드 실행), 이 과정에서는 복잡한 상태 변동이 일어나기 때문이죠. 차근차근 짚어나가 보겠습니다.   - 기본적으로 하나의 스레드 객체가 생성이 되면(NEW 상태)- 스케줄링이 아직 되지 않았기 때문에 실행 대기 상태로 전환됩니다(RUNNABLE). - 스케줄링이 되면 CPU 점유 후 run( )을 실행합니다(RUNNING).- RUNNING 상태에서는 run( ) 메서드를 모두 실행하기 전에 스케줄링에 의해  실행 대기 상태로 돌아가 다른 스레드가 실행 상태로 변합니다.   > 이렇게 번갈아가며 스레드는 실행과 실행 대기를 오가며 자신의 run( )을 조금씩 실행합니다.- 실행 상태에서 run( ) 메서드가 .. 공감수 0 댓글수 0 2024. 11. 19.
  • 멀티 스레드(4) - 동기화 메서드와 동기화 블록 3 앞선 아티클에서 동기화(synchronized) 메서드/블록 선언을 배웠습니다. 이제 우리가 이전에 작성했던 Calculator 예제를 수정해서 동기화 메서드/블록을 실습해 보겠습니다.  앞선 아티클에서 작성했던 코드를 다시 살펴보겠습니다.  // Calculator.javapublic class Calculator { private int memory; public int getMemory() { return memory; } public void setMemory(int memory) { this.memory = memory; try { Thread.sleep(2000); } catch(InterruptedException e) {} System.out.println(Thread.cu.. 공감수 0 댓글수 0 2024. 11. 18.
  • 멀티 스레드(4) - 동기화 메서드와 동기화 블록 2 앞선 아티클에서 공유 객체를 사용하는 과정에 대해서 살펴보았습니다. 그럼 반대로 한 객체를 특정 스레드가 사용 중일 때 다른 스레드가 변경할 수 없도록 만드는 기능도 필요해질 것입니다.  멀티 스레드 체계에서 딱 하나의 스레드만 실행할 수 있는 영역을 임계 영역(critical seciton)이라고 칭하는데, 이 임계 영역은 동기화(synchronized) 메서드/블록을 통해서 설정이 가능합니다. 스레드가 어떤 객체 내부의 동기화 메서드 / 블록에 들어가면, 즉시 객체가 잠기며 다른 스레드가 해당 임계 영역의 코드를 실행하지 못하게 됩니다.      ○ synchronized 사용법 기본적으로 동기화 메서드를 선언할 때는 메서드 선언에 synchronized 키워드를 포함하면 됩니다. 인스턴스, stat.. 공감수 3 댓글수 3 2024. 11. 14.
  • 멀티 스레드(4) - 동기화 메서드와 동기화 블록 1 공유객체라는 개념을 이제부터 설명해 보겠습니다. 싱글 스레드일 경우에는 한 개의 스레드가 객체를 단독으로 사용하기 때문에 큰 이슈가 없습니다. 하지만 멀티 스레드일 경우에는 여러 개의 스레드가 객체를 공유하며 작업하는 경우가 많습니다. 이 때, 하나의 객체를 스레드 A가 사용하는데 도중에 스레드 B에 의해 상태가 변경될 수도 있습니다. 결국, 이럴 경우에는 스레드 A가 의도했던 방향과 다른 결과가 발생할 수도 있습니다(누군가 쓰던 계산기 프로그램을 다른 사람이 와서 만지는 상황과 비슷하죠). 예를 들어, User1 스레드가 Cacluator 객체 안의 memory 필드에 100을 저장하고 바로 2초간 일시 정지 상태가 되었습니다. 그런데, 그 사이에 User2 스레드가 memory 필드 값을 50으로 변.. 공감수 0 댓글수 0 2024. 11. 11.
  • 멀티 스레드(3) - 스레드 우선순위 2 앞서서 살펴본 스레드 스케줄링은 두 가지 방식이 있습니다. (1) 우선순위 (Priority) 방식과 (2) 순환 할당(Round-Robin)이죠. 우선순위 방식은 말 그대로, 할당된 우선 순위에 따라 우선순위가 높은 스레드가 실행 상태를 더 많이 가져가는 것입니다. 순환 할당 방식은 시간 할당량(Time Slice)을 배분하고 정해진 시간만큼 실행한 다음 다시 다른 스레드를 실행하는 방식을 의미합니다.  여기서 우선순위 방식은 직접 우선순위 부여가 가능하므로 직접 코드로 제어가 가능하지만, 순환 할당 방식은 가상 머신에 의해 컨트롤되고 정해지는 방식으로 코드 제어가 불가능하다는 점을 기억해야 합니다.       우선순위는 1~10까지 부여됩니다. 주의할 점은 우선순위는 10이 가장 높고, 1이 가장 낮.. 공감수 1 댓글수 0 2024. 11. 7.
  • 멀티 스레드(3) - 스레드 우선순위 1 스레드에 있어서 '우선순위'개념은 왜 필요한 것일까요? 우선, 기본적으로 하나의 코어에서는 하나의 스레드를 실행한다고 이해하면 되겠습니다. 이 때, 코어의 개수에 따라서 동시성(Concurrency) / 병렬성(Parallelism)을 갖게 됩니다. 여기서 "동시성"과 "병렬성"의 개념적 차이는 무엇일까요?  대표적인 설명을 들자면, 이는 싱글 코어와 멀티 코어의 차이로 생각하시면 되겠습니다. [동시성]은 하나의 코어에서 멀티 스레드가 번갈아 실행되는 성질을 의미합니다. [병렬성]은 말 그대로 멀티 코어에서 각각의 스레드를 동시에 실행하는 성질을 의미하게 됩니다.  즉, 싱글 코어에서는 멀티 스레드 작업이 실제로는 병렬로 실행되는 것은 아닙니다. 번갈아 작업하는 동시성 작업이 워낙 빨라서 사람에게는 병럴.. 공감수 0 댓글수 0 2024. 11. 6.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.