Java Class Notes

Thread(스레드)

헤일리유 2023. 3. 10. 17:28

 

Thread(쓰레드)


 

 

 

Process and Thread

프로그램     ----- 실행 ----->     프로세스

 

프로그램 : 실행 가능한 파일(HDD)

프로세스 : 실행 중인 프로그램(메모리)

 

 

 

 

 

Thread in Java

  • 하나의 프로그램이 동시에 여러 개의 일을 수행할 수 있도록 해 주는것
  • 순차적으로 동작하는 문장들의 단일 집합
  • 경량(lightweight) 프로세스
  • 다중 스레드
    - 하나의 프로세스(프로그램)에 하나 이상의 스레드를 생성하 여 실행할 때
  • 자바는 스레드를 지원하기 위해 java.lang.Thread 클래스 제공

 

 

 

 

 

Process and Thread 

Process : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성

Thread : 프로세스 내에서 실제 작업을 수행.
            모든 프로세스는 하나 이상의 쓰레드를 가지고 있다.

    프로세스 : 쓰레드 = 공장 : 일꾼

 

 

 

 

 

 

Multi-process and Multi-thread 

 

하나의 새로운 프로세스를 생성하는 것보다
하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.

 

 

 

 

 

 

 

 

Multi-thread 

  • 동시성
    - 멀티작업위해하나의코어에서멀티스레드가번갈아가며실행하는성질
  • 병렬성
    - 멀티작업을위해멀티코어에서개별스레드를동시에실행하는성질

 

 

 

 

 

 

 

Pros and Cons of Multi-thread 

 

Pros Cons
여러 모로 좋다.
프로그래밍할 때 고려해야 할 사항들이 많다.
- 자원을 보다 효율적으로 사용할 수 있다 - 동기화(synchronization)에 주의해야 한다.
- 사용자에 대한 응답성(responseness)이 향상된다. - 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다. 
- 작업이 분리되어 코드가 간결해 진다. - 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다.

 

 

 

 

 

 

 

Multi-tasking (멀티태스킹)

멀티 태스킹이란?

  • 컴퓨터에서 각각의 일을 전담하는 해당 프로그램들(여러 개의 프로세스 (Process))이 동시에 실행되는 것.
    멀티 태스킹을 위해 운영체제가 취하는 방식이 멀티 프로세스 시스템이다.

스케줄링(Scheduling)이란?

  • 멀티프로세스 시스템에서 각 프로세스는 동시에 실행되는것 처럼 보이지만, CPU가 하나이기 때문에 실행시간을 잘게 나누어 프로세스가 돌아가는데 각 프로세스들이 돌아가면서 CPU를 점유하는데 프로세스간 CPU점유작업을 말함.

 

 

 

Thread class 

  • JDK는 스레드를 지원하는 java.lang.Thread 클래스 제공
  • 스레드를 생성하기 위해 사용
  • 4개의 생성자를 제공

    Thread()
    Thread(String
    s)
    Thread(Runnable
    r)
    Thread(Runnable
    r, String s)

 

Thread Class Methods 메소드가 하는 일   
void sleep(long msec msec에 지정된 밀리초(milliseconds) 동안 대기
throws InterruptedException
void sleep(long msec, int nsec
    InterruptedException 
msec에 지정된 밀리초+nsec에 지정된 throws 나노초(nanoseconds) 동안 대기 
String getName()
void setName(String s)
스레드의 이름을 반환
스레드의 이름을 s로 설정
void start() 스레드를 시작시킨다. run() 메소드를 호출
int getPriority() 스레드의 우선 순위를 반환
void setPriority(int p) 스레드의 우선 순위를 p값으로 설정
boolean isAlive() 스레드가 시작되었고 아직 끝나지 않았으면 true를 그렇지 않으면 false를 반환 
void join()
    throws InterruptedException
스레드가 끝날 때까지 대기
void run()  스레드가 실행할 부분을 기술하는 메소드하위 클래스에서 오버라이딩 되어야 한다
void suspend() 스레드가 일시 정지된다. resume()에 의해 다시 시작될 수 있다.
void resume() 일시 정지된 스레드를 다시 시작시킨다.

 

 

 

 

 

 

 

Thread 생성

  • Thread 클래스로부터 직접 상속받아 스레드 를 생성
  • Runnable 인터페이스를 사용하는 방법(현 재의 클래스가 이미 다른 클래스로부터 상속 받고 있는 경우)

 

 

 

 

 

 

 

Thread 클래스 이용

  • Thread 클래스를 상속받은 뒤, 해당 스레드에서 지원하고 싶은 코드를 run()메서드에서 오버라이딩 해준다.
  • 해당 스레드를 생성한 후, 스레드 객체의 start()메서드를 호출한다.
class ThreadA extends Thread { // Thread 클래스로부터 상속 
	.........
	public void run() {
		.... // 상위 클래스인 Thread 클래스의 run() 메서드를 오버 
        .... //라이딩하여스레드가수행하여야하는문장들을기술
	}
	....... 
}
ThreadA ta = new ThreadA(); 
ta.start();
// 스레드 객체를 생성하여 스레드를 
// 시작시킨다

 

 

 

 

 

 

 

 


 

 

 

Ex - ThreadEx1

1. thread 사용 X

package ch12;

class Thread1 extends Thread {
	public void run() {
		for (int i=0; i<100; i++) {	// thread를 실행하는 메서드 
			System.out.print("Thread"+i+"\t");
			if (i%9 ==0) System.out.println();
			try {
				Thread.sleep(500);	// .5초 쉬어라 단위 1/1000초 
			} catch (InterruptedException e) {}
		}
	}
}


public class ThreadEx1 {

	public static void main(String[] args) {
		Thread1 th1 = new Thread1();
		th1.run();
//		th1.start();
		for (int i=0; i<100; i++) {
			System.out.print("Main"+i+"\t");
			if (i%9 == 0) System.out.println();
			try {
				Thread.sleep(500);	// .5초 쉬어라 단위 1/1000초 
			} catch (InterruptedException e) {}		
		}
	}
}

>>> 느림, 순차적 (slower, in order)

 

2. thread 사용

package ch12;

class Thread1 extends Thread {
	public void run() {
		for (int i=0; i<100; i++) {	// thread를 실행하는 메서드 
			System.out.print("Thread"+i+"\t");
			if (i%9 ==0) System.out.println();
			try {
				Thread.sleep(500);	// .5초 쉬어라 단위 1/1000초 
			} catch (InterruptedException e) {}	
		}
	}
}


public class ThreadEx1 {

	public static void main(String[] args) {
		Thread1 th1 = new Thread1();
//		th1.run();
		th1.start();
		for (int i=0; i<100; i++) {
			System.out.print("Main"+i+"\t");
			if (i%9 == 0) System.out.println();
			try {
				Thread.sleep(500);	// .5초 쉬어라 단위 1/1000초 
			} catch (InterruptedException e) {}		
		}
	}
}
Main0	
Thread0	
Main1	Thread1	Thread2	Main2	Main3	Thread3	Thread4	Main4	Thread5	Main5	Thread6	Main6	Thread7	Main7	Main8	Thread8	Main9	
Thread9	
Thread10	Main10	Thread11	Main11	Thread12	Main12	Thread13	Main13	Thread14	Main14	Thread15	Main15	Main16	Thread16	Thread17	Main17	Thread18	
Main18	
Thread19	Main19	Thread20	Main20	Main21	Thread21	Main22	Thread22	Main23	Thread23	Thread24	Main24	Thread25	Main25	Thread26	Main26	Thread27	
Main27	
Thread28	Main28	Thread29	Main29	Thread30	Main30	Thread31	Main31	Main32	Thread32	Main33	Thread33	Thread34	Main34	Thread35	Main35	Thread36	
Main36	
Main37	Thread37	Main38	Thread38	Thread39	Main39	Thread40	Main40	Thread41	Main41	Thread42	Main42	Thread43	Main43	Thread44	Main44	Main45	
Thread45	
Main46	Thread46	Thread47	Main47	Thread48	Main48	Thread49	Main49	Thread50	Main50	Thread51	Main51	Thread52	Main52	Thread53	Main53	Thread54	
Main54	
Thread55	Main55	Thread56	Main56	Thread57	Main57	Thread58	Main58	Thread59	Main59	Thread60	Main60	Thread61	Main61	Thread62	Main62	Thread63	
Main63	
Thread64	Main64	Thread65	Main65	Thread66	Main66	Thread67	Main67	Thread68	Main68	Thread69	Main69	Thread70	Main70	Thread71	Main71	Thread72	
Main72	
Thread73	Main73	Thread74	Main74	Thread75	Main75	Thread76	Main76	Thread77	Main77	Thread78	Main78	Thread79	Main79	Thread80	Main80	Thread81	
Main81	
Thread82	Main82	Thread83	Main83	Thread84	Main84	Thread85	Main85	Thread86	Main86	Thread87	Main87	Thread88	Main88	Thread89	Main89	Thread90	
Main90	
Thread91	Main91	Thread92	Main92	Thread93	Main93	Thread94	Main94	Thread95	Main95	Thread96	Main96	Thread97	Main97	Thread98	Main98	Thread99	
Main99

>>  faster ,  not in order

 

2. 3D thread

package ch12;

class Thread1 extends Thread {
	public Thread1(String title) {
		super(title);
	}
	public void run() {
		for (int i=0; i<100; i++) {	// thread를 실행하는 메서드 
			System.out.print(getName()+i+"\t");
			if (i%9 ==0) System.out.println();
			try {
				Thread.sleep(500);	// .5초 쉬어라 단위 1/1000초 
			} catch (InterruptedException e) {}
		}
	}
}


public class ThreadEx1 {

	public static void main(String[] args) {
		Thread1 th1 = new Thread1("th1");
		Thread1 th2 = new Thread1("th2");
//		th1.run();
		th1.start();	th2.start();
		for (int i=0; i<100; i++) {
			System.out.print("Main"+i+"\t");
			if (i%9 == 0) System.out.println();
			try {
				Thread.sleep(500);	// .5초 쉬어라 단위 1/1000초 
			} catch (InterruptedException e) {}		
		}
	}
}
Main0	
th10	
th20	
Main1	th21	th11	th22	th12	Main2	th13	Main3	th23	th14	Main4	th24	th15	Main5	th25	th16	th26	Main6	th17	th27	Main7	th18	th28	Main8	th19	
th29	
Main9	
th110	th210	Main10	th111	th211	Main11	th112	th212	Main12	th113	th213	Main13	th114	Main14	th214	th115	Main15	th215	th216	th116	Main16	th117	Main17	th217	th118	
Main18	
th218	
th119	Main19	th219	Main20	th220	th120	Main21	th221	th121	Main22	th122	th222	Main23	th123	th223	Main24	th224	th124	Main25	th125	th225	Main26	th126	th226	th127	
Main27	
th227	
th228	th128	Main28	Main29	th129	th229	th130	Main30	th230	th131	Main31	th231	Main32	th232	th132	th233	th133	Main33	th234	th134	Main34	Main35	th135	th235	Main36	
th136	
th236	
Main37	th137	th237	Main38	th138	th238	Main39	th139	th239	Main40	th140	th240	Main41	th141	th241	Main42	th142	th242	Main43	th143	th243	Main44	th144	th244	Main45	
th145	
th245	
Main46	th146	th246	Main47	th147	th247	Main48	th148	th248	Main49	th149	th249	Main50	th250	th150	Main51	th251	th151	Main52	th152	th252	Main53	th153	th253	Main54	
th254	
th154	
Main55	th255	th155	Main56	th156	th256	Main57	th157	th257	Main58	th258	th158	Main59	th159	th259	Main60	th260	th160	Main61	th161	th261	Main62	th262	th162	Main63	
th263	
th163	
Main64	th264	th164	Main65	th265	th165	Main66	th166	th266	Main67	th267	th167	Main68	th168	th268	Main69	th169	th269	Main70	th270	th170	Main71	th271	th171	Main72	
th272	
th172	
Main73	th273	th173	Main74	th274	th174	Main75	th175	th275	Main76	th176	th276	Main77	th177	th277	Main78	th178	th278	Main79	th279	th179	Main80	th180	th280	Main81	
th281	
th181	
Main82	th282	th182	Main83	th283	th183	Main84	th284	th184	Main85	th185	th285	Main86	th286	th186	Main87	th287	th187	Main88	th288	th188	Main89	th289	th189	Main90	
th290	
th190	
Main91	th291	th191	Main92	th292	th192	Main93	th293	th193	Main94	th294	th194	Main95	th295	th195	Main96	th296	th196	Main97	th297	th197	Main98	th198	th298	Main99	
th299	
th199