toggle menu

JAVA 정리 - THREAD

2012.08.02 10:00 JAVA

여러개의 작업을 시간을 잘게 쪼게서 동시에 처리하는 것처럼 보이게 하는 것.
더 빠르지는 않고 미세한 작업 전환 시간으로 인해 오히려 더 느릴 수 있다.
프로세스 스케쥴링 정책은 OS마다 다름. 따라서 결과가 각각 달라질 수 있음. 


구현 방법

① 상속을 받는 법
class A extends Thread
{
	@Override
	public void run()
	{
		//Thread에서 해야하는 일
		//동시 작업이 필요한 것을 여기에 위치시킨다.
	}
}

class ThreadTest
{
	public static void main( String [] args )
	{
		A a = new A();
		
		a.run(); //이건 그냥 메소드 호출!
		//그냥 run()을 호출하면 메소드 실행에 불과하다!
		//이건 Trhead가 아님!!
		
		a.start(); //스레드 실행
		//이렇게 하면 스레드가 동작한다.
	}
}


② implements 하는 방법
class B implements Runnable
{

	@Override
	public void run() //Runnable에는 이 메소드만 있다.
	{
		//Thread에서 해야하는 일
		//동시 작업이 필요한 것을 여기에 위치시킨다.
	}
	
}

class ThreadTest
{
	public static void main( String [] args )
	{
	
		//Runnable은 아직 스레드가 생성된 것이 아니다.
		//따라서 아래와 같이 스레드를 생성해야 한다.
		
		B b = new B(); //재정의된 run()이 선언된 B를 생성
		Thread thread = Thread(b); //B를 스레드에 담아준다.
		thread.start(); //스레드 실행
	}
}



재사용성은 조금 떨어지지만, 익명 클래스를 사용해서 바로 실행할 수도 있다!!

① Thread 클래스를 사용한 방법
new Thread()
{
	@Override
	public void run()
	{
		//Thread에서 해야하는 일
		//동시 작업이 필요한 것을 여기에 위치시킨다.
	}
	
}.start(); //스레드 실행


② Runnable 인터페이스를 사용한 방법
Thread thread = new Thread(new Runnable()
{
	@Override
	public void run()
	{
		//Thread에서 해야하는 일
		//동시 작업이 필요한 것을 여기에 위치시킨다.
	}
});

thread.start(); //스레드 실행



join
스레드1.join() 이라고 하면, 스레드1이 완료된 이후에 스레드2를 수행한다.
스레드1을 start한후, 스레드2를 start 하기전 써준다.

setDaemon
Daemon이 죽으면 다른 스레드들도 죽도록(?)

sleep
대기 상태로 만들어주는 메소드
Thread.sleep(500); 과 같은 형태로 사용하며 try/catch 구문 아래 들어가야 한다.

Thread.currentThread()
인터페이스를 상속받았을 때 현재 스레드를 알기 위함



간단한 스레드 예제
public class ThreadExam
{
	public static void main(String[] args)
	{
		new Thread()
		{
			@Override
			public void run()
			{
				for( int i = 0 ; i < 100 ; i++ )
					System.out.println("첫번째 스레드" + i);
			}

		}.start(); // 스레드 실행

		Thread thread = new Thread(new Runnable()
		{
			@Override
			public void run()
			{
				for( int i = 0 ; i < 100 ; i++ )
					System.out.println("두번째 스레드" + i);
			}
		});

		thread.start(); // 스레드 실행
	}
}

결과는 실행시마다 달라지겠지만, 아래와 같이 나타난다.

첫번째 스레드0
첫번째 스레드1
첫번째 스레드2
첫번째 스레드3
첫번째 스레드4
첫번째 스레드5
첫번째 스레드6
두번째 스레드0
두번째 스레드1
두번째 스레드2
두번째 스레드3
두번째 스레드4
두번째 스레드5
두번째 스레드6
두번째 스레드7
두번째 스레드8
첫번째 스레드7
두번째 스레드9
두번째 스레드10

두 작업이 동시에 이루어지고 있음을 볼 수 있다.



 

JAVA 관련 포스팅 더보기