Chapter6/6-21 · master · Youngju-Jang / Javacoursework · GitLab
GitLab.com
gitlab.com
package ch6;
class PriorityThread extends Thread {
public void run() {
int sum = 0;
Thread t = Thread.currentThread();
System.out.println(t + "start");
for(int i=0; i<=1000000; i++) {
sum += i;
}
System.out.println(t.getPriority() + "end");
}
}
public class PriorityTest {
public static void main(String[] args) {
int i;
for(i=Thread.MIN_PRIORITY; i<= Thread.MAX_PRIORITY; i++) {
PriorityThread pt = new PriorityThread();
pt.setPriority(i);
pt.start();
}
}
}
=-=========================
Thread[Thread-2,3,main]start
Thread[Thread-5,6,main]start
Thread[Thread-9,10,main]start
Thread[Thread-8,9,main]start
Thread[Thread-7,8,main]start
Thread[Thread-6,7,main]start
10end
Thread[Thread-4,5,main]start
7end
6end
Thread[Thread-3,4,main]start
Thread[Thread-0,1,main]start
8end
9end
Thread[Thread-1,2,main]start
1end
5end
3end
2end
4end
PriorityThread pt1 = new PriorityThread();
PriorityThread pt2 = new PriorityThread();
PriorityThread pt3 = new PriorityThread();
pt1.setPriority(Thread.MIN_PRIORITY);
pt2.setPriority(Thread.NORM_PRIORITY);
pt3.setPriority(Thread.MAX_PRIORITY);
pt1.start();
pt2.start();
pt3.start();
=================
Thread[Thread-2,10,main]start
10end
Thread[Thread-0,1,main]start
Thread[Thread-1,5,main]start
1end
5end
1부터 50, 51부터 100 까지의 합을 구하는 두 개의 Thread를 만들어 그 결과를 확인해보세요
멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만
지역변수의 초기화는 필수적이다.
package ch6;
public class JoinTest extends Thread{
int start;
int end;
int total;
public JoinTest(int start, int end) {
this.start = start;
this.end = end;
}
public void run() {
int i;
for (i=start; i<=end; i++) {
total += i;
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread() + "start");
JoinTest jt1 = new JoinTest(1, 50);
JoinTest jt2 = new JoinTest(51, 100);
jt1.start();
jt2.start();
int lastTotal = jt1.total + jt2.total; >> total계산전에 수행됨 >> 0들어감
System.out.println("jt1.total = " + jt1.total); >> 이거할땐 수행끝나서 값나옴
System.out.println("jt2.total = " + jt2.total);
System.out.println("lastTotal = "+lastTotal);
System.out.println(Thread.currentThread() + "end");
}
}
===================
Thread[main,5,main]start
jt1.total = 0
jt2.total = 0
lastTotal = 0
Thread[main,5,main]end
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread() + "start");
JoinTest jt1 = new JoinTest(1, 50);
JoinTest jt2 = new JoinTest(51, 100);
jt1.start();
jt2.start();
//main이 jt1,2에 join걺 >> main은 수행x 대기
try {
jt1.join();
jt2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
int lastTotal = jt1.total + jt2.total;
System.out.println("jt1.total = " + jt1.total);
System.out.println("jt2.total = " + jt2.total);
System.out.println("lastTotal = "+lastTotal);
System.out.println(Thread.currentThread() + "end");
=================
Thread[main,5,main]start
jt1.total = 1275
jt2.total = 3775
lastTotal = 5050
Thread[main,5,main]end
세 개의 thread를 만든다.
각각 무한 루프를 수행하게 한다.
작업 내용 this.sleep(100);
‘A’ 를 입력 받으면 첫 번째 thread를
‘B’ 를 입력 받으면 두 번째 thread를
‘C’ 를 입력 받으면 세 번째 thread를
‘M’을 입력 받으면 모든 thread와 main() 함수를 종료한다.
public class TerminateThread extends Thread{
private boolean flag = false;
int i;
public TerminateThread(String name){
super(name);
}
public void run(){
while(!flag){
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println( getName() + " end" );
}
public void setFlag(boolean flag){
this.flag = flag;
}
public static void main(String[] args) throws IOException {
TerminateThread threadA = new TerminateThread("A"); >> 스레드이름이 A됨
TerminateThread threadB = new TerminateThread("B");
TerminateThread threadC = new TerminateThread("C");
threadA.start();
threadB.start();
threadC.start();
int in;
while(true){
in = System.in.read();
if ( in == 'A'){
threadA.setFlag(true);
}else if(in == 'B'){
threadB.setFlag(true);
}else if( in == 'C'){
threadC.setFlag(true);
}else if( in == 'M'){
threadA.setFlag(true);
threadB.setFlag(true);
threadC.setFlag(true);
break;
}else{
System.out.println("type again");
}
}
System.out.println("main end");
}
}
===================
A
type again
type again
A end
C
type again
type again
C end
type again
type again
C
type again
type again
M
main end
B end
ch 6.23. wait()/notify() 에서드를 활용한 동기화 프로그래밍 (0) | 2022.07.18 |
---|---|
ch 6.22 멀티 Thread 프로그래밍에서의 동기화 (0) | 2022.07.18 |
ch6.20~22 thread 스레드 (0) | 2022.07.15 |
ch6.19 데코레이터 패턴을 활용한 커피 머신 프로그램(decorator) (0) | 2022.07.15 |
ch6.16~ 보조스트림, 직렬화, 그외 여러 입출력클래스 (0) | 2022.07.13 |
댓글 영역