Thread_basic01
TREAD 정의를 돕기 위한 글..
실행 중인 프로그램을 PROSESS 프로세스라고 한다. 그렇지만 이 하나의 프로그램 내부에서 두 가지 이상의 프로그램 흐름을 형성할 수 있다.
간단하게 쌍방향으로 소통하는 1:1 프로그램은 2개의 쓰레드(프로그램 흐름)을 사용해야 가능하다. thread의 뜻이 '실'이며 객체가 아닌 프로그램 흐름/실이라고 생각하자.
이미 main에서 실행을 하고있다면 기본적으로 싱글쓰레드가 생성되었다는 뜻이다.
쓰레드 생성시 실행 순서
public class Ex1 {
public void printLoop(){
new Thread( ()-> {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+": "+i);
}
}).start();
}
public static void main(String[] args) {
Ex1 obj = new Ex1();
obj.printLoop();
obj.printLoop();
obj.printLoop();
System.out.println("end.........................");
}
}
public class Ex1 {
public void printLoop(){
new Thread( ()-> {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+": "+i);
}
}).start();
}
public static void main(String[] args) {
Ex1 obj = new Ex1();
obj.printLoop();
obj.printLoop();
obj.printLoop();
System.out.println("end.........................");
}
}
포인트1. printLoop에서 쓰레드 번호 - for문의 i
포인트2. main의 마지막 code는 end 프린트
결과 콘솔창
동작 순서
1. main에서 obj.printLoop에서 쓰레드 0번 for루프 시작
2. main에서 obj.printLoop에서 쓰레드 1번 for루프 시작
3. main에서 obj.printLoop에서 쓰레드 2번 for루프 시작
4. end.... 출력
5. for결과 출력
6. 모든 obj.printLoop가 끝나면 시스템 종료
해석
- 쓰레드의 실행방식은 시스템의 상황과 환경에 따라 달라진다. (즉, 매번 순서가 달라짐)
- 메인과 각 쓰레드 각각 다른 흐름을 가지고 있음.
쓰레드의 특징
-
자바 가상머신은 쓰레드의 실행을 스케줄링한다.
스케줄링 기본원칙
- 우선순위가 높은 쓰레드의 실행을 우선한다.
- 동일한 우선순위의 쓰레드가 둘 이상일 때, cpu의 할당시간을 분배해서 실행한다.
-
쓰레드는 운영체제에 의존적이다. 이 특성으로 가상머신이 동작하는 운영체제에 따라서 실행의 결과가 다르게 나타낼수 있다.
자바 가상머신은 쓰레드의 실행을 스케줄링한다.
스케줄링 기본원칙
- 우선순위가 높은 쓰레드의 실행을 우선한다.
- 동일한 우선순위의 쓰레드가 둘 이상일 때, cpu의 할당시간을 분배해서 실행한다.
쓰레드는 운영체제에 의존적이다. 이 특성으로 가상머신이 동작하는 운영체제에 따라서 실행의 결과가 다르게 나타낼수 있다.
Q. 왜 위의 예제에서 우선순위가 소용이 없어보였는가
네트워크를 통한 데이터의 송수신 역시 CPU 할당이 필요치 않는 데이터의 입출력에 해당이 된다. 프로그램의 실질적인 흐름을 담당하는 쓰레드 역시 CPU의 할당이 필요하지 않는 데이터의 입출력과 관련 있는 연산을 상당부분 처리한다고 볼 수 있다.
이러한 상황에 놓였을 때, (CPU의 할당이 필요치 않은 입출력을 처리하는 상황에 놓였을 때)
쓰레드는 무리하게 CPU를 차지하려 하지 않는다.
오히려 이러한 상황에서는 자신에게 할당된 CPU를 다른 쓰레드들에게 넘긴다.
출처 : 나는 자바를 공부한 적이 없다구요
Thread의 사용 방법
1. extends Thread, 상속
객체 1 : Thread 1
객체 1 : Thread 1
1.1 Thread 상속
public class Test extends Thread {
1.2 run()메소드 오버라이드
@Override
public void run(){
super.run();
}
1.3 start() 호출
public static void main(String[] args) {
Test t = new Test();
t.start();
System.out.println("end");
}//main end
- java 상속 특성상 다중 상속 불가
- run()의 내용이 끝나면 쓰레드 종료
2. implements Runnable, 인터페이스
객체 1 : Thread 多
2.1 인터페이스 구현
public class Test2 implements Runnable {
2.2 run()메소드 오버라이드
public void run() {
System.out.println("i'm "+Thread.currentThread().getName());
}
2.3 Thread 객체 생성 (2가지)
public static void main(String[] args) {
Thread t1 = new Thread(new Test2());
Thread t2 = new Thread(new Test2());
Runnable runnable = new Test2();
Thread t3 = new Thread(runnable);
2.4 start() 호출
t1.start();
t2.start();
t3.start();
System.out.println("end...");
} //main end
결과
고민해야 할 것들
- 객체지향, 절차지향 그리고 루프의 유무 등을 모두 고려해서 설정
- 동시에 진행되어야 하는 부분 고려하기(loop)
- 쓰레드 적용 (new thread, extends, implements 등) -> start()
- 쓰레드가 수량도 속도/성능도 생각해보자
Author And Source
이 문제에 관하여(Thread_basic01), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yeonnie/Threadbasic01저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)