浏览代码

스레드 응용 추가

tobby48 3 年前
父节点
当前提交
1be8effb9e

+ 45
- 0
src/kr/co/swh/lecture/java/scene4/ThreadHigh1A.java 查看文件

@@ -0,0 +1,45 @@
1
+package kr.co.swh.lecture.java.scene4;
2
+
3
+/**
4
+ * <pre>
5
+ * kr.co.swh.lecture.java.scene4
6
+ * ThreadHigh1A.java
7
+ *
8
+ * 설명 : 쓰레드 고급 첫 번째 예제
9
+ * </pre>
10
+ * 
11
+ * @since : 2021. 12. 23.
12
+ * @author : tobby48
13
+ * @version : v1.0
14
+ */
15
+public class ThreadHigh1A extends Thread{
16
+	
17
+	private int sum = 0;
18
+	private int count = 0;
19
+	
20
+	@Override
21
+	public void run() {
22
+		// TODO Auto-generated method stub
23
+		synchronized(this){
24
+			while(true) {
25
+				count++;
26
+				sum += count;
27
+				if(count % 5 == 0) {
28
+					break;
29
+				}
30
+				System.out.println(count + "ThreadA 쓰레드가 동작합니다.");
31
+				try {
32
+					Thread.sleep(1000);
33
+				} catch (InterruptedException e) {
34
+					// TODO Auto-generated catch block
35
+					e.printStackTrace();
36
+				}
37
+			}
38
+			notify();
39
+		}
40
+	}
41
+	
42
+	public int getSum() {
43
+		return sum;
44
+	}
45
+}

+ 39
- 0
src/kr/co/swh/lecture/java/scene4/ThreadHigh1Main.java 查看文件

@@ -0,0 +1,39 @@
1
+package kr.co.swh.lecture.java.scene4;
2
+
3
+/**
4
+ * <pre>
5
+ * kr.co.swh.lecture.java.scene4
6
+ * ThreadHigh1Main.java
7
+ *
8
+ * 설명 : 쓰레드 고급 첫 번째 예제
9
+ * </pre>
10
+ * 
11
+ * @since : 2021. 12. 23.
12
+ * @author : tobby48
13
+ * @version : v1.0
14
+ */
15
+public class ThreadHigh1Main {
16
+	
17
+	
18
+	public static void main(String[] args) {
19
+		ThreadHigh1A threadA = new ThreadHigh1A();
20
+		threadA.start();
21
+		//	아래 주석코드를 풀고 다시 실행해보세요.
22
+//		try {
23
+//			Thread.sleep(100);
24
+//		} catch (InterruptedException e1) {
25
+//			// TODO Auto-generated catch block
26
+//			e1.printStackTrace();
27
+//		}
28
+		synchronized (threadA) {
29
+			System.out.println("ThreadA 가 완료될때까지 Wait...");
30
+			try {
31
+				threadA.wait();
32
+			} catch (InterruptedException e) {
33
+				// TODO Auto-generated catch block
34
+				e.printStackTrace();
35
+			}
36
+			System.out.println("5의 배수일때까지 합산은 : " + threadA.getSum());
37
+		}
38
+	}
39
+}

+ 45
- 0
src/kr/co/swh/lecture/java/scene4/ThreadHigh1SecondMain.java 查看文件

@@ -0,0 +1,45 @@
1
+package kr.co.swh.lecture.java.scene4;
2
+
3
+/**
4
+ * <pre>
5
+ * kr.co.swh.lecture.java.scene4
6
+ * ThreadHigh1SecondMain.java
7
+ *
8
+ * 설명 : 쓰레드 고급 첫 번째 예제
9
+ * </pre>
10
+ * 
11
+ * @since : 2021. 12. 23.
12
+ * @author : tobby48
13
+ * @version : v1.0
14
+ */
15
+public class ThreadHigh1SecondMain {
16
+	
17
+	
18
+	public static void main(String[] args) {
19
+		ThreadHigh1A threadA = new ThreadHigh1A();
20
+		threadA.start();
21
+		ThreadHigh1A threadA2 = new ThreadHigh1A();
22
+		threadA2.start();
23
+		synchronized (threadA) {
24
+			System.out.println("ThreadA 가 완료될때까지 Wait...");
25
+			try {
26
+				threadA.wait();
27
+			} catch (InterruptedException e) {
28
+				// TODO Auto-generated catch block
29
+				e.printStackTrace();
30
+			}
31
+			System.out.println("5의 배수일때까지 합산은 : " + threadA.getSum());
32
+		}
33
+		//	아래 코드에서 이상한 점은 없나요?
34
+		synchronized (threadA2) {
35
+			System.out.println("ThreadA 가 완료될때까지 Wait...");
36
+			try {
37
+				threadA2.wait();
38
+			} catch (InterruptedException e) {
39
+				// TODO Auto-generated catch block
40
+				e.printStackTrace();
41
+			}
42
+			System.out.println("5의 배수일때까지 합산은 : " + threadA.getSum());
43
+		}
44
+	}
45
+}

+ 53
- 0
src/kr/co/swh/lecture/java/scene4/ThreadHigh2.java 查看文件

@@ -0,0 +1,53 @@
1
+package kr.co.swh.lecture.java.scene4;
2
+
3
+/**
4
+ * <pre>
5
+ * kr.co.swh.lecture.java.scene4
6
+ * ThreadHigh2.java
7
+ *
8
+ * 설명 : 쓰레드 고급 두 번째 예제
9
+ * </pre>
10
+ * 
11
+ * @since : 2021. 12. 23.
12
+ * @author : tobby48
13
+ * @version : v1.0
14
+ */
15
+public class ThreadHigh2 extends Thread{
16
+	
17
+	private int sum = 0;
18
+	private ThreadHigh2SubJob otherThread;
19
+	
20
+	public ThreadHigh2(ThreadHigh2SubJob otherThread) {
21
+		// TODO Auto-generated constructor stub
22
+		this.otherThread = otherThread;
23
+	}
24
+	
25
+	@Override
26
+	public void run() {
27
+		// TODO Auto-generated method stub
28
+		synchronized(this){
29
+			for(int i=1; i<5; i++) {
30
+				sum += i;
31
+				System.out.println(i + "상위 쓰레드가 동작합니다.");
32
+				try {
33
+					Thread.sleep(1000);
34
+				} catch (InterruptedException e) {
35
+					// TODO Auto-generated catch block
36
+					e.printStackTrace();
37
+				}
38
+			}
39
+			try {
40
+				this.otherThread.join();
41
+			} catch (InterruptedException e) {
42
+				// TODO Auto-generated catch block
43
+				e.printStackTrace();
44
+			}
45
+			sum += this.otherThread.getSum();
46
+			notify();
47
+		}
48
+	}
49
+	
50
+	public int getSum() {
51
+		return sum;
52
+	}
53
+}

+ 34
- 0
src/kr/co/swh/lecture/java/scene4/ThreadHigh2Main.java 查看文件

@@ -0,0 +1,34 @@
1
+package kr.co.swh.lecture.java.scene4;
2
+
3
+/**
4
+ * <pre>
5
+ * kr.co.swh.lecture.java.scene4
6
+ * ThreadHigh2Main.java
7
+ *
8
+ * 설명 : 쓰레드 고급 두 번째 예제
9
+ * </pre>
10
+ * 
11
+ * @since : 2021. 12. 23.
12
+ * @author : tobby48
13
+ * @version : v1.0
14
+ */
15
+public class ThreadHigh2Main {
16
+	
17
+	
18
+	public static void main(String[] args) {
19
+		ThreadHigh2SubJob subThread = new ThreadHigh2SubJob();
20
+		subThread.start();
21
+		ThreadHigh2 threadA = new ThreadHigh2(subThread);
22
+		threadA.start();
23
+		synchronized (threadA) {
24
+			System.out.println("상위 가 완료될때까지 Wait...");
25
+			try {
26
+				threadA.wait();
27
+			} catch (InterruptedException e) {
28
+				// TODO Auto-generated catch block
29
+				e.printStackTrace();
30
+			}
31
+			System.out.println("1~10까지 합산은 : " + threadA.getSum());
32
+		}
33
+	}
34
+}

+ 39
- 0
src/kr/co/swh/lecture/java/scene4/ThreadHigh2SubJob.java 查看文件

@@ -0,0 +1,39 @@
1
+package kr.co.swh.lecture.java.scene4;
2
+
3
+/**
4
+ * <pre>
5
+ * kr.co.swh.lecture.java.scene4
6
+ * ThreadHigh2SubJob.java
7
+ *
8
+ * 설명 : 쓰레드 고급 두 번째 예제
9
+ * </pre>
10
+ * 
11
+ * @since : 2021. 12. 23.
12
+ * @author : tobby48
13
+ * @version : v1.0
14
+ */
15
+public class ThreadHigh2SubJob extends Thread{
16
+	
17
+	private int sum = 0;
18
+	
19
+	@Override
20
+	public void run() {
21
+		// TODO Auto-generated method stub
22
+		synchronized(this){
23
+			for(int i=5; i<11; i++) {
24
+				sum += i;
25
+				System.out.println(i + "하위 쓰레드가 동작합니다.");
26
+				try {
27
+					Thread.sleep(500);
28
+				} catch (InterruptedException e) {
29
+					// TODO Auto-generated catch block
30
+					e.printStackTrace();
31
+				}
32
+			}
33
+		}
34
+	}
35
+	
36
+	public int getSum() {
37
+		return sum;
38
+	}
39
+}

+ 80
- 0
src/kr/co/swh/lecture/java/scene4/ThreadHigh3Main.java 查看文件

@@ -0,0 +1,80 @@
1
+package kr.co.swh.lecture.java.scene4;
2
+
3
+/**
4
+ * <pre>
5
+ * kr.co.swh.lecture.java.scene4
6
+ * ThreadHigh3Main.java
7
+ *
8
+ * 설명 : 쓰레드 고급 생산자 소비자 모델
9
+ * </pre>
10
+ * 
11
+ * @since : 2021. 12. 23.
12
+ * @author : tobby48
13
+ * @version : v1.0
14
+ */
15
+public class ThreadHigh3Main {
16
+	public static void main(String[] args) {
17
+		WorkObject shareObject = new WorkObject(); 	//공유객체 생성
18
+
19
+		ThreadA threadA = new ThreadA(shareObject);
20
+		ThreadB threadB = new ThreadB(shareObject);	//ThreadA와 ThreadB 생성
21
+
22
+		threadA.start();
23
+		threadB.start();
24
+
25
+	}
26
+}
27
+//공유객체
28
+class WorkObject {
29
+	public synchronized void methodA() {
30
+		System.out.println("ThreadA의 methodA() 작업 실행");
31
+		notify(); 	//일시정지 상태에 있는 ThreadB를 실행대기 상태로 만듬.
32
+		try {
33
+			wait();	//ThreadA를 일시정지 상태로 만듬.
34
+		} catch (Exception e) {
35
+		}
36
+	}
37
+
38
+	public synchronized void methodB() {
39
+		System.out.println("ThreadB의 methodB() 작업 실행");
40
+		notify();	//일시정지 상태에 있는 ThreadA를 실행대기 상태로 만듬.
41
+		try {
42
+			wait();	//ThreadB를 일시정지 상태로 만듬.
43
+		} catch (Exception e) {
44
+		}
45
+	}
46
+}
47
+
48
+//Thread A
49
+class ThreadA extends Thread{
50
+	private WorkObject workObject;
51
+
52
+	public ThreadA(WorkObject workObject) {
53
+		this.workObject = workObject;
54
+	}
55
+
56
+	@Override
57
+	public void run() {
58
+		for(int i =0; i<10; i++) {
59
+			workObject.methodA();
60
+		}
61
+	}
62
+}
63
+
64
+//ThreadB
65
+class ThreadB extends Thread{
66
+	private WorkObject workObject;
67
+
68
+	public ThreadB(WorkObject workObject) {
69
+		this.workObject = workObject;
70
+	}
71
+
72
+	@Override
73
+	public void run() {
74
+		for(int i =0; i<10; i++) {
75
+			workObject.methodB();
76
+		}
77
+	}
78
+}
79
+
80
+