'스레드'에 해당되는 글 3건

  1. 2020.06.28 스레드의 동기화
  2. 2020.06.28 스레드 우선 순위
  3. 2020.06.27 스레드(thread)

스레드의 동기화

자바 2020. 6. 28. 22:24

임계 영역

- 동시에 여러 개의 스레드가 특정 소스코드 혹은 메서드를 동시에 접근할 경우 해당 메서드를 서로 사용하려고 하는데 이처럼 여러 개의 스레드가 동시에 접근할 수 있는 코드 영역 혹은 메서드를 임계 영역이라고 부른다

 

- 프로그램에서 임계 영역이 있을 경우 프로그램 전체의 심각한 오류를 발생 시킬 수도 있다

 

- 자바에서는 동기화를 통해 이러한 부분을 해결할 수 있다

 

동기화

- 동기화를 하게 되면 임계 영역 때문에 발생되는 문제를 막아 줄 수 있다

 

- 동기화를 하게 되면 스레드가 접근하는 순서대로 코드를 처리하고 늦게 도착하는 스레드는 기다렸다가 먼저 도착한 스레드의 작업이 완료가 되면 다음 스레드가 작업을 하게 된다

 

- 동기화는 메서드를 동기화 하는 방법과 코드의 일부분을 동기화하는 방법으로 나눠진다

 

메서드의 동기화

- 여려 개의 스레드가 호출하는 메서드가 있다고 한다면 메서드의 코드는 임계 영역에 해당한다

 

- 이런 경우에는 메서드 전체를 동기화 하면 되는데 다음과 같이 작성해 주면 된다

 

public synchronized void method( ) {

         임계 영역 코드

}

 

Sync1.java

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

DataClass d = new DataClass( );

 

Thread1 t1 = new Thread1(d);

Thread1 t2 = new Thread1(d);

t1.setName("T1");

t2.setName("T2");

 

t1.start( );

t2.start( );

 

class Thread1 extends Thread{

    DataClass dc;

 

    public Thread(DataClass dc) {

          this.dc = dc;

    }

 

    public void run( ) {

         dc.method(Thread.currentThread( ).getName( ));

    }

}

 

class DataClass{

 

    public synchronized void method(String name) {

         for(int i = 0 ; i < 10 ; i++) {

             try {

                  Thread.sleep(1000);

             }catch(Exception e) { }

             System.out.println(name + " : " + i);

         }

    }

}

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

 

코드의 동기화

- Run 메서드의 코드 일부분을 동기화하고자 할 때 임계 영역에 해당하는 코드 부분을 synchronized 블록으로 묶어 주면 된다

 

Synchronized(클래스 혹은 객체) {

        임계 영역 코드

}

 

Sync2.java

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

Thread1 t = new Thread1( );

 

Thread t1 = new Thread(t, "T1");

Thread t2 = new Thread(t, "T2");

 

t1.start( );

t2.start( );

 

class Thread1 extends Thread{

 

    public void run( ) {

          synchronized(this) {

               for(int i = 0 ; i < 10 : i++) {

                   try {

                        Thread.sleep(1000);

                   }catch(Exception e) { }

                   System.out.println(Thread.currentThread().getName( ) + " : " + i);

               }

           }

     }

}

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

'자바' 카테고리의 다른 글

Java wrapper  (0) 2020.07.04
자바 예외처리  (0) 2020.06.30
스레드 우선 순위  (0) 2020.06.28
스레드(thread)  (0) 2020.06.27
인터페이스(interface)  (0) 2020.06.27
Posted by khon98
,

스레드 우선 순위

자바 2020. 6. 28. 21:21

스레드 우선순위

- 자바의 스레드는 우선순위라는 것을 가지고 있다

 

- 하나의 프로그램에서 동시에 여러 개의 스레드가 운영될 경우 우선 처리할 스레드를 결정하는데 스레드 우선순위를 이용한다

 

- 우선순위 값은 1 ~ 10 까지 이며 기본 값은 5이다

 

- 스레드의 우선 순위 값이 10이면 가장 먼저 처리할 확률이 높아지고 1이면 다른 것보다 늦게 처리될 확률이 높아진다

 

- 우선순위가 높다고 해서 반드시 가장 먼저 처리되는 것은 아니고 가장 먼저 처리될 확률이 높아지는 것뿐이다

 

PriorityTest.java

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

Thread1 t1 = new Thread1( );

Thread2 t2 = new Thread2( );

 

// System.out.println(t1.getPriority( ));

// System.out.println(t2.getPriority( ));

 

t1.setPriority(1);

t2.setPriority(10);

 

t1.start( );

t2.start( );

 

class Thread1 extends Thread{

 

    public void run( ) {

         for(int i = 0 ; i < 100 ; i++) {

             System.out.print("*");

         }

    }

}

 

class Thread2 extends Thread{

    public void run( ) {

          for(int i = 0 ; i < 100 ; i++) {

              System.out.print("_");

          }

     }

}

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

'자바' 카테고리의 다른 글

자바 예외처리  (0) 2020.06.30
스레드의 동기화  (0) 2020.06.28
스레드(thread)  (0) 2020.06.27
인터페이스(interface)  (0) 2020.06.27
추상 클래스  (0) 2020.06.26
Posted by khon98
,

스레드(thread)

자바 2020. 6. 27. 17:35

스레드

- 프로그램을 작성하다 보면 동시에 여러 개의 일을 해야 할 때가 있다

 

- 이러한 멀티 프로세싱을 구현할 수 있도록 제공하는 것이 스레드이다

 

스레드 작성 법

- 스레드를 작성하는 방법은 Thread 클래스를 상속받는 방법과 Runnable 인터페이스를 구현하는 방법 두 가지가 있다

 

클래스 상속 방법

- Thread 클래스를 상속받고 run 메서드를 구현해 주면 된다

 

class 클래스 이름 extends Thread{

 

       public void run( ) {

             소스코드

       }

}

 

인터페이스 구현 법

- Runnable 인터페이스를 구현하고 run 메서드를 구현하면 된다

 

class 클래스 이름 implements Runnable{

 

       public void run( ) {

             소스코드

       }

}

 

스레드 사용 법

- Thread 클래스를 상속받았을 경우에는 상속받은 클래스의 객체를 생성하고 start 메서드를 호출해준다

 

- interface를 사용할 경우에는 Thread 클래스의 객체를 생성하고 생성자에 인터페이스를 구현한 클래스의 객체를 넣어준다 그 이후에 start 메서드를 호출해준다

 

*Thread에는 Sleep이라는 메서드를 사용할 수 있음 인자 값으로 숫자를 적어주는데 100이라고 적어주면 100ms(millisecond, ms는 1000번에 1초)만큼 쉬었다가 진행

 

ThreadTest.java

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

Thread t1 = new Thread1( );

t1.start( );

 

Thread t2 = new Thread2( );

Thread t = new Thread(t2);

t.start( );

 

while(true) {

     try {

          Thread.sleep(1000);

     }catch(Exception e) { }

     System.out.print("*");

}

 

class Thread1 extends Thread{

 

    public void run( ) {

          while(true) {

               try {

                    Thread.sleep(1000);

               }catch(Exception e) { }

               System.out.print("-");

          }

    }

}

 

class Thread2 implements Runnable{

 

    @Override

    public void run( ) {

         // TODO Auto-generated method stub

         while(true) {

              try {

                   Thread.sleep(1000);

              }catch(Exception e) { }

              System.out.print("_");

         }

    }

}

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

'자바' 카테고리의 다른 글

스레드의 동기화  (0) 2020.06.28
스레드 우선 순위  (0) 2020.06.28
인터페이스(interface)  (0) 2020.06.27
추상 클래스  (0) 2020.06.26
중첩 클래스  (0) 2020.06.25
Posted by khon98
,