2020.10.28 고급자바 수업노트 thread 기초

try{

    Thread.sleep(3000);

} catch (InterruptedExceptione ) {

       e.printStackTrace(); 


 Thread.sleep(3000); : 괄호안의 시간동안 잠시 Thread 를 멈춘다. 


 package kr.or.ddit.basic;




//멀티 쓰레드 


public class ThreadTest02 {


public static void main(String[] args) {

// Thread 를 작성해서 사용하는 방법 

//방법1 

//Thread 클래스를 상속한 class 의 인스턴스를 생성한 후 

//이 인스턴스의 start() 메서드를 호출해서 실행한다. 

MyThread1 th1 = new MyThread1();  //인스턴스 객체 생성 

th1.start(); //run() 메소드를 호출을 하는게 아니라 start() 를 호출한다고 생각해야함.

//방법2 

// Runnable 인터페이스를 구현한 class 의 인스턴스를 생성한 후

// 이 인스턴스를 Thread 의 인스턴스를 생성할 때 생성자의 인수값으로 넘겨준다. 

// 이 때 생성된 Thread 의 인스턴스의 start() 메서드를 호출해서 실행한다. 

MyThread2 r2 = new MyThread2(); 

Thread th2 = new Thread(r2); 

th2.start();

//방법3 ==> 익명 구현체를 이용하는 방법 

//Runnable r3 = new Runnable(); //인터페이스는 내부에 메소드만 선언이 되어 있어서 완전한 클래스가 아니다. 직접 인스턴스를 생성못해

Runnable r3 = new Runnable() {

@Override

public void run() {

for(int i = 1 ; i <=200 ; i++) {

System.out.print("%");

try {

Thread.sleep(100);

} catch (InterruptedException e) {

// TODO: handle exception

}

}

}


};

//--> 익명 구현체 

Thread th3 = new Thread(r3); 

th3.start();

//run() 메소드를 호출하는게 아니라 start() 메소드를 호출한다. 




System.out.println("main 메스드 끝......");

//멀티쓰레드 프로그램에서는 이 프로그램이 끝난다는 것은 모든 쓰레드가 끝나야지만 전체가 끝난다. 메인 메소드가 끝나도 

//다른 쓰레드가 작동중이면 다른 쓰레드가 끝나야지만 끝난다. 

}


}



class MyThread1 extends Thread{

@Override

public void run() {

//이 run() 메서드 안에 Thread 가 처리할 내용을 기술한다. 

for(int i = 1 ; i <= 200 ; i++) {

System.out.print("*");

try {

// Thread.sleep(시간) ; => 이 메소드는 주어진 '시간'동안 작업을 잠시 멈춘다. 

// '시간' 은 밀리세컨드 단위를 사용한다. 

// 즉, 1000은 1초를 의미한다. 

Thread.sleep(100);

} catch (InterruptedException e) {

// TODO: handle exception

}

}

}

}


//방법 2 


class MyThread2 implements Runnable {

@Override

public void run() {

for(int j = 1; j<=200; j++) {

System.out.print("&");

try {

Thread.sleep(100);

} catch (InterruptedException e) {

}

}

}

}



Thread 의 우선순위 


코어의 1개당 우선순위를 작용하기 때문에 

코어가 4개일때 의미가 없을 수 있다 ( 많은 작업을 하지 않는이상 ) 

priority 부여 순서의 크기는 의미가 없고 뭐가 먼저인지만 판단 

1~3 과 2~8 은 크기에 큰차이가 없고 뭐가 먼저이고 뭐가 나중인지를 판단한다.


package kr.or.ddit.basic;


public class ThreadTest08 {


public static void main(String[] args) {

Thread th1 = new UpperThread(); 

Thread th2 = new LowerThread(); 


// 우선 순위는 start() 메서드를 호출하기 전에 변경해야한다. 

th1.setPriority(9);

th2.setPriority(7); //숫자가 큰것이 우선순위가 높다. 

//싱글코어일때는 쓰레드의 우선순위의 영향을 많이 받는다.

System.out.println("th1 의 우선순위 : " + th1.getPriority());

System.out.println("th2 의 우선순위 : " + th2.getPriority());

th1.start();

th2.start();

}


}


//대문자를 출력하는 쓰레드

class UpperThread extends Thread {


@Override

public void run() {

for ( char c = 'A'; c<= 'Z'; c++) { 

System.out.println(c);


// 아무것도 하지 않는 반복문 -- 시간때우기용 

for ( int i = 1 ; i <=  2_000_000_000 ; i++) { } 

}

}


//소문자를 출력하는 쓰레드 


class LowerThread extends Thread {


@Override

public void run() {

for ( char c = 'a'; c<= 'z'; c++) { 

System.out.println(c);


// 아무것도 하지 않는 반복문 -- 시간때우기용 

for ( int i = 1 ; i <= 2_000_000_000 ; i++) { } 

}

}




-----------------------------------------------------------------------------------------------------


데몬쓰레드 ( daemon thread ) 


데몬쓰레드를 설정해주면 메인으로 여겨지는 쓰레드가 끝나는 동시에 데몬쓰레드도 끝내준다. 예시 ) : 컴퓨터의 보호화면, 자동저장기능 등등 

boolean isDaemon () - 쓰레드가 데몬쓰레드인지 확인 

void setDaemon(boolean on ) - 




package kr.or.ddit.basic;



//데몬 쓰레드 연습 ==> 자동 저장하는 쓰레드 




public class ThreadTest09 {


public static void main(String[] args) {

AutoSaveThread autoSave = new AutoSaveThread (); 

//** 중요  데몬 쓰레드로 설정해줘서 메인끝나는동시에 같이 끝내주기. 밑에 있는 데몬쓰레드가없으면 메인 쓰레드가 끝난뒤에 남아있는 다른쓰레드는 계속실행

               autoSave.setDaemon(true);

**얘는 start() 하기 전에 써줘야 한다.

autoSave.start();

                //setDaemon 을 해줬기 때문에 autoSave 는 메인메소드가 실행이 끝나는 동시                    에 얘도 실행이 끝나게 된다.

try {

for(int i = 1 ; i <=20 ; i++) {

System.out.println(i);

Thread.sleep(1000);

}

} catch (InterruptedException e) {

}

System.out.println("main 쓰레드 종료....");


}


}



//자동 저장하는 쓰레드 ==> 3초에 한번씩 자동 저장하는 쓰레드 


class AutoSaveThread extends Thread { 

//작업 내용을 저장하는 메서드 

public void save() {

System.out.println("작업내용을 저장합니다.");

}

@Override

public void run() {

while(true) {

try {

Thread.sleep(3000);

save(); 

} catch (InterruptedException e) {

}

}

}

}



댓글