YJ의 새벽
JAVA (쓰레드 thread) 본문
--프로세스 : 실행중인 프로그램, 자원 (메모리,cpu ... ) 과 쓰레드로 구성.
--쓰레드 : 프로세스 내에서 실제 작업을 수행.
모든 프로세스는 하나 이상의 쓰레드를 가지고있다.
멀티쓰레드의 장점 : 시스템자원을 효율적으로 사용할수있음.
사용자에대한 응답성이 향상.
작업이 분리되어 코드가 간결.
멀티쓰레드의 단점 : 동기화(synchronization)에 주의 해야함.
교착상태가 발생하지않도록 주의.
프로그래밍 할 때 고려해야 할 사항들이 많다.
쓰레드 구현과 실행.
-- 자바는 단일 상속이므로, Runnable 을 구현하는것이 좀더 실용적이다.
EX ))) 쓰레드를 실행해보자.
-- 쓰레드를 실행시키면 (start()) 바로 실행되는게 아니고,
OS 스케줄러가 실행순서를 결정한다. ( OS에 의존 )
class ThreadEx1 extends Thread{ //extends Thread
@Override
public void run() {
for( int i=0; i < 10 ;i++ ) {
System.out.println(getName()); //Thread의 getName() 호출
}
}
}
class ThreadEx2 implements Runnable{ // implements Runnable
@Override
public void run() {
for( int i=0; i< 10 ;i++ ) {
System.out.println( Thread.currentThread().getName() ); //현재실행중인 Thread호출
}
}
}
public class Example {
public static void main(String[] args) {
ThreadEx1 t1 = new ThreadEx1();
Runnable r = new ThreadEx2();
Thread t2 = new Thread(r); //생성자 Thread (Runnable target)
//Thread t2 = new Thread( new ThreadEx2());
t1.start();
t2.start();
}
}
main 쓰레드
--main메서드의 코드를 수행하는 쓰레드.
-- 사용자쓰레드와 데몬(보조) 쓰레드 두종류가 있다.
-- 실행중인 사용자 쓰레드가 하나도 없을때 프로그램은 종료된다.
쓰레드의 I/O 블락킹
--입출력시 작업중단.
--사용자로부터 입력을 받는구간에서는 아무일도 하지 않는다 . (싱글쓰레드)
( 멀티쓰레드를 사용하면 작업이 진행된다. )
EX ))) 싱글쓰레드 진행시
입력하기 전까지 프로그램이 멈춘다.
import javax.swing.JOptionPane;
public class Example {
public static void main(String[] args) {
String input = JOptionPane.showInputDialog("아무값 입력하세요");
System.out.println("입력한 값은 : "+ input);
// 입력하기 전까지 멈춰있음.
for(int i=10 ; i > 0 ; i--) {
System.out.println(i);
try {
Thread.sleep(1000); // 1초씩 쉬었다가 진행
} catch(Exception e) {
}
}
}
}
EX )))) 멀티쓰레드 진행시 .
입력하지않아도 다른쓰레드가 프로그램을 진행한다.
import javax.swing.JOptionPane;
class ThreadEx extends Thread {
@Override
public void run() {
for(int i=10 ; i > 0 ; i--) {
System.out.println(i);
try {
Thread.sleep(1000); // 1초씩 쉬었다가 진행
} catch(Exception e) {
}
}
}
} //end of ThreadEx
public class Example {
public static void main(String[] args) {
ThreadEx thread = new ThreadEx();
thread.start();
String input = JOptionPane.showInputDialog("아무값 입력하세요");
System.out.println("입력한 값은 : "+ input);
// 값을 입력하지않아도 카운트 진행.
}
}
- 쓰레드의 우선순위
--작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여
특정 쓰레드가 더 많은 작업시간을 갖게 할수 있다.
--JAVA 에서는 1~10 까지 범위를 잡을수 있다.
윈도우 OS 에는 32단계가 있기때문에,
우리가 주는 1~10 범위는 OS에 부탁하는 참고용 .
--우선순위가 높은 쓰레드가 더 많은 할당량을 같는다.
EX ))) 쓰레드의 우선순위.
class ThreadEx extends Thread {
@Override
public void run() {
for( int i=0; i < 300; i++ ) {
System.out.print("-");
for(int x=0; x < 10000000; x++);
}
}
} //end of ThreadEx 쓰레드1 생성
class ThreadEx2 extends Thread{
@Override
public void run() {
for( int i=0; i < 300; i++ ) {
System.out.print("|");
for(int x=0; x < 10000000; x++);
}
}
} //end of ThreadEx2 쓰레드2 생성
public class Example {
public static void main(String[] args) {
ThreadEx thread = new ThreadEx();
ThreadEx2 thread2 = new ThreadEx2();
thread2.setPriority(7); // thread2 우선순위 7
System.out.println("Priority thread(-) : "+thread.getPriority());
System.out.println("Priority thread2(|) : "+thread2.getPriority());
thread.start();
thread2.start();
//우선순위가 높다고 무조건이 아니라.
//확률을 더 올려준다고 생각하자.
}
}
- 쓰레드 그룹
--서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것.
--모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야한다.
--쓰레드 그룹을 지정하지않고 생성한 쓰레드는 main쓰레드 그룹에 속한다.
--자신을 생성한 쓰레드(부모쓰레드) 의 그룹과 우선순의를 상속받는다.
------쓰레드그룹의 메서드
'SelfStudy > JAVA' 카테고리의 다른 글
JAVA (쓰레드의 메서드) (0) | 2023.02.07 |
---|---|
JAVA ( 데몬 쓰레드 ) (0) | 2023.02.07 |
JAVA (애너테이션) (0) | 2023.02.06 |
JAVA (열거형) (0) | 2023.02.06 |
JAVA (제네릭 <?>, 형변환) (0) | 2023.02.05 |