본문 바로가기
Java | spring/Java Basic

Java, 동시 실행 스레드! Multi Thread 프로그래밍

by 워니 wony 2019. 5. 8.

 

Multi process

  • 동시에 여러 프로그램을 실행 있다.
  • 우리가 사용하고 있는 윈도우 운영체제는 멀티프로세서 지원
  • 동시에 여러가지 프로그램을 실행 있다.

 

Multi thread

  • 하나의 프로그램안에서 여러가지 기능이 동시에 실행 있다
  • 예를 들면 한글프로그램에서 인쇄하기와 문서작성이 동시에 이루어 있다.

 

 

자바에서 멀티스레드 프로그램을 위하여 제공하는 클래스가 Thread.

멀티스레드 프로그래밍을 위하여 Thread 클래스를 확장하여 새로운 클래스를 만들고, run 메소드를 재정의 하여 안에 Thread 해야 일을 기술한다. 다른 Thread 공평하게 동작하고자 하는 문장을 run메소드에 기술한다.

 

 

자바는 Multi Thread 프로그램을 위하여 Thread클래스와 Runnable 인터페이스를 제공

자바는 클래스의 다중상속을 지원하지 않으므로 만약 내가 만든 클래스가 멀티 Thread 지원해야 하고 다른 클래스를 확장해야 한다면 Runnable 인터페이스를 이용한다.

 

필요하다면 응급성이 있는 쓰레드에 우선순위를 부여할 있다.

setPriority()메소드를 이용합니다. 우선 순위 값은 1~10

1    MIN_PRIORITY

10   MAX_PRIORITY

5     NORM_PRIORITY

 

t.setRriority(Thread.MAX_PRIORITY);

 

 

**Thread import 해도 되나?

==> Thread클래스는 java.lang패키지에 있다.

java.lang 패키지는 자바프로그램에서 기본적인 클래스들을 담고 있어서 자동 import 된다.

 

 

Multi Thread 프로그래밍 방법

자바가 제공하는 Thread 클래스를 확장하여 새로운 클래스를 만들고,

run( ) 메소드를 재정의 하여 안에 공평하게 실행 시키고자 하는 명령어들을 기술한다.

 

이제 공평하게 실행시키려면  클래스의 객체를 생성하고

run( ) 직접 호출하지 않고 start( ) 호출하여 Thread 가동시킵니다. ==>공평하게 실행시켜주세요.

 

이것을 Thread 가동한다고 한다.

 

만약 run( ) 직접 호출 하면 Thread 가동(공평하게 실행)하는 것이 아니라 일반 메소드처럼 동작한다.
 

Thread 공평하게 실행 시키려면 start 메소드를 호출해야 한다.

실수로 run 직접 호출 하면, Thread 가동시키는 것이 아니라 run 일반 메소드 처럼 취급한다. (순차적 실행)

but,  동일한 순서로 나오는 것은 아니다.

 

class Person extends Thread
{
	private String name;
	public Person(String name)
	{
		this.name = name;
	}

	public void run()
	{
		try{
			for (int i = 1 ; i <=10 ; i++)
			{
				System.out.println("Hello"+name+"==>"+i);
				Thread.sleep(500);
			}
		}catch(Exception e){
		}
	}

}

class ThreadTest
{
	public static void main(String[] args) 
	{
		Person p1 = new Person("홍길동");
		Person p2 = new Person("이남동");
			
		p1.start();
		p2.start();
	}
}

 

 

만약 우리의 클래스가 이미 있는 다른 클래스를 상속 받아야 하고 멀티 Thread 되어야 한다면 Runnable 인터페이스를 이용한다. 

다른 클래스를 상속 받고, 멀티스레드를 하기 위해서 인터페이스로 확장해서 사용한다.

 

때도 공평하게 동작시키고자 하는 내용은 run메소드를 오버라이딩 하여 안에 기술한다.

 

때는 객체를 생성하여 객체를 통해 바로 start 호출 없다.

Thread 객체로 포장하여 start 호출해야 한다.

 

 

Thread 우선 순위

- 우선순위를  설정했다고 해서 반드시 먼저 작업이 종료되는 것은 아니다. 가급적 먼저 종료해 달라고 요구 하는

 

void

setPriority(int newPriority)

Changes the priority of this thread.

 

Modifier and Type

Constant Field

Value

public static final int

MAX_PRIORITY

10

public static final int

MIN_PRIORITY

1

public static final int

NORM_PRIORITY

5

출처: <https://docs.oracle.com/javase/8/docs/api/constant-values.html#java.lang.Thread.MAX_PRIORITY>

 

class Person extends Thread
{
	private String name;
	public Person(String name)
	{
		this.name = name;
	}

	public void run()
	{
		try{
			for (int i = 1 ; i <=5 ; i++)
			{
				System.out.println("Hello"+name+"==>"+i);
				Thread.sleep(100);
			}
		}catch(Exception e){
		}
	}

}

class ThreadTest04
{
	public static void main(String[] args) 
	{
		Person p1 = new Person("홍길동");
		Person p2 = new Person("이남동");
		Person p3 = new Person("삼남동");
		Person p4 = new Person("김동동");
		Person p5 = new Person("박자바");

		p1.setPriority(Thread.MIN_PRIORITY);
		p2.setPriority(Thread.MIN_PRIORITY);
		p3.setPriority(Thread.MIN_PRIORITY);
		p4.setPriority(Thread.MIN_PRIORITY);
		p5.setPriority(Thread.MAX_PRIORITY);

		p1.start();
		p2.start();
		p3.start();
		p4.start();
		p5.start();
	}
}

(결과값)

Hello홍길동==>1

Hello박자바==>1

Hello김동동==>1

Hello이남동==>1

Hello삼남동==>1

Hello홍길동==>2

Hello이남동==>2

Hello삼남동==>2

Hello김동동==>2

Hello박자바==>2

Hello홍길동==>3

Hello이남동==>3

Hello삼남동==>3

Hello박자바==>3

Hello김동동==>3

Hello홍길동==>4

Hello이남동==>4

Hello삼남동==>4

Hello박자바==>4

Hello김동동==>4

Hello홍길동==>5

Hello이남동==>5

Hello삼남동==>5

Hello박자바==>5

Hello김동동==>5

반응형

댓글