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) {
}
}
}
}
댓글
댓글 쓰기