Upload
prisca
View
36
Download
0
Embed Size (px)
DESCRIPTION
10. Multithreading. Java. public class SumTest { public static void main(String a1[]) { int a, b, sum; a = Integer.parseInt (a1[0]); b = Integer.parseInt (a1[1]); sum = a + b ; // 두 수를 더하는 부분입니다 System.out.println (" 두수의 합은 " + sum + " 입니다 "); } - PowerPoint PPT Presentation
Citation preview
10. Multithreading
1
public class SumTest { public static void main(String a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두 수를 더하는 부분입니다 System.out.println(" 두수의 합은 " + sum + " 입니다 "); }}
JAVA
2
Multiple threads on multiple CPUs
Multiple threads sharing a single CPU
Thread 3
Thread 2
Thread 1
Thread 3
Thread 2
Thread 1
• Threads Concept
10 장 . 다중 스레드 3
Thread Class- java.lang Package
Thread()Thread(String s)Thread(Runnable r)Thread(Runnable r, String s)
10 장 . 다중 스레드
4
MethodMethod Description
static void sleep(long msec)throws InterruptedException
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.
static void sleep(long msec, int nsec) throws InterruptedException
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds plus the specified number of nanoseconds, subject to the precision and accuracy of system timers and schedulers.
String getName() Returns this thread's name.
void setName(String s) Changes the name of this thread to be equal to the argument name.
void start()Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.
final int getPriority() Returns this thread's priority.
final void setPriority(int p) Changes the priority of this thread.
void join() throws InterruptedException Waits for this thread to die.
void run()If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns.
void suspend() This method has been deprecated, as it is inherently deadlock-prone
void resume()This method exists solely for use with suspend(), which has been deprecated be-cause it is deadlock-prone
10 장 . 다중 스레드
5
StateMachine diagram
10 장 . 다중 스레드
6
Thread states- New
- Runnable(ready)
- Running(executing)
- Waiting
- Dead(finished)
10 장 . 다중 스레드 7
Thread Class
class ThreadA extends Thread { ......... public void run() { .... } .......}
ThreadA ta = new ThreadA();ta.start();
10 장 . 다중 스레드 8
Runnable Interface
class RunnableB extends Applet implements Runnable { ......... public void run() { ........ } ........}
public interface Runnable { public void run();}
10 장 . 다중 스레드 9
Example
RunnableB rb = new RunnableB(); Thread tb = new Thread(rb);tb.start();
RunnableB rb = new RunnableB();new Thread(rb).start();
10 장 . 다중 스레드 10
Exercises
ThreadFromThread.java
01020304050607080910111213
class ThreadTest extends Thread { public void run() { for (int i=1 ; i<=10 ; i++) { System.out.println(“Java :" + i); } }}public class ThreadFromThread { public static void main(String args[]) { ThreadTest t = new ThreadTest(); t.start(); }}
10 장 . 다중 스레드 11
Java : 1
Java : 2
Java : 3
Java : 4
Java : 5
Java : 6
Java : 7
Java : 8
Java : 9
Java : 10
10 장 . 다중 스레드 12
Exercises
ThreadFromRunnable.java
0102030405060708091011121314
class RunnableTest implements Runnable { public void run() { for (int i=1 ; i<=10 ; i++) { System.out.println(“Java :" + i); } } }public class ThreadFromRunnable { public static void main(String args[]) { RunnableTest r = new RunnableTest(); Thread t = new Thread(r); t.start(); }}
10 장 . 다중 스레드 13
Java : 1
Java : 2
Java : 3
Java : 4
Java : 5
Java : 6
Java : 7
Java : 8
Java : 9
Java : 10
10 장 . 다중 스레드 14
ExercisesDoubleThread.java
010203040506070809101112131415161718192021
class ThreadTest1 extends Thread { public ThreadTest1(String str) { setName(str); } public void run() { for (int i=1 ; i<=10 ; i++) { System.out.println(i + getName()); } System.out.println(“End" + getName()); }}public class DoubleThread { public static void main(String args[]) { ThreadTest1 t1 = new ThreadTest1 (" : Thread1"); ThreadTest1 t2 = new ThreadTest1 (" : Thread2"); t1.start(); t2.start(); }}
10 장 . 다중 스레드 15
1: Thread11: Thread22: Thread12: Thread23: Thread13: Thread24: Thread14: Thread25: Thread15: Thread26: Thread16: Thread27: Thread17: Thread28: Thread18: Thread29: Thread19: Thread210: Thread110: Thread2 End: Thread1End: Thread2
10 장 . 다중 스레드 16
1: Thread21: Thread12: Thread22: Thread13: Thread23: Thread14: Thread24: Thread15: Thread25: Thread16: Thread26: Thread17: Thread27: Thread18: Thread28: Thread19: Thread29: Thread110: Thread210: Thread1 End: Thread2End: Thread1
10 장 . 다중 스레드
17
setPriority()- Changes the priority of this thread.
static final int MAX_PRIORITY ← priority : 10static final int MIN_PRIORITY ← priority : 1static final int NORM_PRIORITY ← priority : 5
10 장 . 다중 스레드
18
ExcercisesThreadPriority.java
01
02
03
04
05
06
07
08
09
10
11
class PriorityTest extends Thread{
public PriorityTest(String str){
setName(str);
}
public void run(){
for(int i=1; i<=5; i++){
System.out.println( i + getName() + " Priority : "
+ getPriority() );
}
}
}
10 장 . 다중 스레드
19
ExcercisesThreadPriority.java
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class ThreadPriority {
public static void main(String args[]){
PriorityTest t1 = new PriorityTest(" : First Thread");
PriorityTest t2 = new PriorityTest(" : Second Thread");
PriorityTest t3 = new PriorityTest(" : Third Thread");
int priority_t1 = Integer.parseInt(args[0]);
int priority_t2 = Integer.parseInt(args[1]);
t1.setPriority(priority_t1);
t2.setPriority(priority_t2);
t3.setPriority(Thread.MIN_PRIORITY);
t1.start();
t2.start();
t3.start();
}
}
10 장 . 다중 스레드
20
1 : Third Thread : 11 : First Thread : 51 : Second Thread : 102 : Second Thread : 103 : Second Thread : 104 : Second Thread : 102 : First Thread : 53 : First Thread : 54 : First Thread : 55 : First Thread : 52 : Third Thread : 15 : Second Thread : 103 : Third Thread : 14 : Third Thread : 15 : Third Thread : 1
10 장 . 다중 스레드
21
10 장 . 다중 스레드
22
실습예제DoubleThread1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
class DoubleThreadTest1 extends Thread {
public DoubleThreadTest1(String str) {
setName(str);
}
public void run() {
for (int i=1 ; i<=3 ; i++) {
System.out.println(i + getName());
}
System.out.println(“End" + getName());
}
}
public class DoubleThread1 {
public static void main(String args[]) {
DoubleThreadTest1 t1 =
new DoubleThreadTest1(" : Thread1");
DoubleThreadTest1 t2 =
10 장 . 다중 스레드
23
실습예제DoubleThread1.java
17
18
19
20
21
22
23
new DoubleThreadTest1(" : Thread2");
System.out.println("***** Start *****");
t1.start();
t2.start();
System.out.println("***** End *****");
}
}
10 장 . 다중 스레드
24
***** Start ********** End *****1 : Thread21 : Thread12 : Thread22 : Thread13 : Thread23 : Thread1End : Thread2End : Thread1
10 장 . 다중 스레드
5 스레드의 시작과 종료
25
실습예제DoubleThread2.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
class DoubleThreadTest2 extends Thread {
public DoubleThreadTest2(String str) {
setName(str);
}
public void run() {
for (int i=1 ; i<=3 ; i++) {
System.out.println(i + getName());
}
System.out.println(“End" + getName());
}
}
public class DoubleThread2 {
public static void main(String args[])throws Exception {
DoubleThreadTest2 t1 = new DoubleThreadTest2
(" : Thread1");
DoubleThreadTest2 t2 = new DoubleThreadTest2
10 장 . 다중 스레드
26
실습예제DoubleThread1.java
17
18
19
20
21
22
23
24
25
(" : Thread2");
System.out.println("***** Start *****");
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("***** End *****");
}
}
10 장 . 다중 스레드
27
***** Start *****1 : Thread11 : Thread22 : Thread12 : Thread23 : Thread13 : Thread2End : Thread1End : Thread2***** End *****
10 장 . 다중 스레드
28
synchronized Method
329 page
Critical section
Critical section
unlock
10 장 . 다중 스레드
29
330 page
10 장 . 다중 스레드
30
ExcercisesTVContribution.java
010203040506070809101112131415161718
class Account { private int total = 0; synchronized void deposit() { total = total + 1000; } int gettotal() { return total; }}class Customer extends Thread { Account same_a; Customer(Account a, String s) { same_a = a; setName(s); } public void run() { for(int i = 0; i < 200 ; i++) { System.out.println(getName() + " : " + i);
10 장 . 다중 스레드
31
실습예제TVContribution.java
192021222324252627282930313233343536
same_a.deposit(); if (same_a.gettotal() >= 500000) break; } }}public class TVContribution { public static void main(String args[])throws Exception { Account same_account = new Account(); Customer donator1 = new Customer(same_account,“Donator1"); Customer donator2 = new Customer(same_account,"Donator2"); Customer donator3 = new Customer(same_account,"Donator3"); Customer donator4 = new Customer(same_account,"Donator4"); Customer donator5 = new Customer(same_account,"Donator5");
10 장 . 다중 스레드
32
실습예제TVContribution.java
3738394041424344454647484950
donator1.start(); donator2.start(); donator3.start(); donator4.start(); donator5.start(); donator1.join(); donator2.join(); donator3.join(); donator4.join(); donator5.join(); System.out.println(“Total : " + same_account.gettotal()); }}
10 장 . 다중 스레드
33
Donator3 : 0Donator3 : 1Donator1 : 0Donator4 : 0 .........Donator5 : 62Donator3 : 124Donator1 : 126Donator4 : 125Donator2 : 62Total : 504000
10 장 . 다중 스레드
34
Donator1 : 0Donator1 : 1Donator1 : 2Donator3 : 0 .........Donator2 : 42Donator3 : 102Donator5 : 92Donator1 : 62Donator2 : 43Total : 503000
10 장 . 다중 스레드
35
java.lang.Object Class
- wait(), notify(), notifyAll()
void wait() throws InterruptedExceptionvoid wait(long msec) throws InterruptedExceptionvoid wait(long msec, int nsec) throws InterruptedException
void notify()void notifyAll()
10 장 . 다중 스레드
36
wait( ), notify( ), notifyAll( ) Method
335 page
10 장 . 다중 스레드
37
ExcercisesProducerConsumer.java
0102030405060708091011121314151617181920
class Buffer { private int contents; private boolean available = false; public synchronized void put(int value) { while (available == true ) { try{ wait(); } catch (InterruptedException e) {} } contents = value; System.out.println (“Producer########## : Produce " + contents); notify(); available = true; }public synchronized int get() { while (available == false ) { try { wait();
10 장 . 다중 스레드
38
ExcercisesProducerConsumer.java
2122232425262728293031323334353637383940
} catch (InterruptedException e) {} } System.out.println (“Consumer########## : Consume " + contents); notify(); available = false; return contents; } }class Producer extends Thread { private Buffer b; public Producer(Buffer blank) { b = blank ; } public void run() { for (int i = 1; i <= 10;i++) b.put(i); }}
10 장 . 다중 스레드
39
ExcercisesProducerConsumer.java
4142434445464748495051525354555657585960
class Consumer extends Thread { private Buffer b; public Consumer(Buffer blank) { b = blank; } public void run() { int value = 0; for (int i = 1 ; i <= 10 ; i++ ) value = b.get(); }}public class ProducerConsumer { public static void main(String args[]) { Buffer buff = new Buffer(); Producer p1 = new Producer(buff); Consumer c1 = new Consumer(buff); p1.start() ; c1.start() ; }}
10 장 . 다중 스레드
40
Producer ########## : Produce 0Consumer########## : Consume 0Producer ########## : Produce 1
............................
Consumer########## : Consume 7 Producer ########## : Produce 8 Consumer########## : Consume 8 Producer ########## : Produce 9 Consumer########## : Consume 9