스레드란?
프로세스는 프로그램의 실행 단위이고 프로세스를 구성하는 작업단위를 스레드라고 한다.
스레드는 경량 프로세스라고도 불리는데 이유는 프로세스의 공통 Resource를 공유하기 때문이다.
Thread 상속법
class ThreadClass extends Thread {
ThreadClass(){
start();
}
//오버라이딩
public void run(){
while(true){
System.out.println("Sub Thread");
try{
Thread.sleep(1000); //스레드를 일시 중시(1초동안)
}catch(Exception e){}
}
}
void method(){
while(true){
System.out.println("Main Thread");
try{
Thread.sleep(1000); //스레드를 일시 중시(1초동안)
}catch(Exception e){}
}
}
public static void main(String[] args) {
ThreadClass t = new ThreadClass();
t.method();
}
}
Runnable 상속법
class RunnableClass implements Runnable {
RunnableClass(){
Runnable r = this;
Thread th = new Thread(r);
th.start();
}
//오버라이딩
public void run(){
while(true){
System.out.println("Sub Thread by Runnable");
try{
Thread.sleep(1000);
}catch(Exception e){}
}
}
void method(){
while(true){
System.out.println("Main Thread");
try{
Thread.sleep(1000);
}catch(Exception e){}
}
}
public static void main(String[] args) {
RunnableClass r = new RunnableClass();
r.method();
}
}
MultiThread
class Thread01 implements Runnable{
public void run() {
while(true) {
System.out.println("Thread01");
try {
Thread.sleep(1000);
}catch(InterruptedException ie){}
}
}
}
class Thread02 extends Thread {
public void run() {
while(true) {
System.out.println("Thread02");
try {
Thread.sleep(1500);
}catch(InterruptedException ie){}
}
}
}
class MultiThread {
MultiThread() throws InterruptedException {
new Thread(new Thread01()).start();
new Thread02().start();
play();
}
void play() throws InterruptedException {
while(true) {
System.out.println("MultiThread");
Thread.sleep(3000);
}
}
public static void main(String[] args) throws InterruptedException{
new MultiThread();
}
}
Join() 사용
join()을 사용하면 해당 스레드가 종료되기를 기다렸다가 다음으로 넘어감
class ThreadEx01 extends Thread {
ThreadEx01(){
this.start();
try{
join(); //join사용 시 해당 스레드가 종료되기 전 까지 기다렸다가 다음으로 넘어감~
}catch(InterruptedException ie){} //main쓰레드가 멈춤
}
public void run(){
for(int i=0; i<3; i++){
System.out.println("자식 쓰레드가 일을 한다");
try{
Thread.sleep(500);
}catch(InterruptedException ie){}
}
System.out.println("자식 쓰레드가 죽었다");
}
public static void main(String[] args) {
new ThreadEx01();
System.out.println("메인 쓰레드가 죽었다");
}
}
Priority
Ready 상태의 스레드 중에서 우선적으로 CPU를 점유할 수 있는 스레드를 판별하기 위한 LEVEL 값 (범위 1 ~ 10)
범위가 클수록 우선순위가 높으며 우선순위는 상대적인것이다.
따라서 Thread1보다 Thread2가 더 빨리 끝날 가능성이 높다.
스레드에 기본값은 5이다(main에서 기본값 상속받음)
class PriorityEx {
public static void main(String[] args) {
//System.out.println("max : " + Thread.MAX_PRIORITY); //10
//System.out.println("min : " + Thread.MIN_PRIORITY); //1
//System.out.println("nor : " + Thread.NORM_PRIORITY); //5
Thread1 t1 = new Thread1();
Thread2 t2 = new Thread2();
t1.setPriority(1);
t2.setPriority(10);
t1.start();
t2.start();
}
}
class Thread1 extends Thread {
public void run() {
int total = 0;
for(int i = 0; i <= 500; i++) {
System.out.print("1");
}
System.out.println("Thread1 작업완료");
}
}
class Thread2 extends Thread {
public void run() {
int total = 0;
for(int i = 0; i <= 500; i++) {
System.out.print("2");
}
System.out.println("Thread2 작업완료");
}
}
동기화
하나 이상의 스레드가 어떤 연산 또는 로직에 동시에 접근할 때 그연산의 무결성을 보장하기 위해 수행영역에 대한 lock을 걸어주는것(화장실 문고리 같은 역할을 함)
ex1) synchronized void m(){ 동기화 필요한 로직; }
ex2) synchronized(this) { 동기화 필요한 로직; }
class SyncClass extends Thread {
int i = 0;
SyncClass(){
new Thread(this).start();
m1();
}
synchronized void m1(){
for(int j = 0; j <100; j++) {
i++;
System.out.println("메인 : " + i);
}
}
void m2(){
synchronized(this){ //자신
i++;
}
System.out.println("서브 : " + i);
}
public void run(){
m2();
}
public static void main(String[] args) {
new SyncClass();
}
}