본문 바로가기

JAVA 공책/수업 메모

Thread

** Thread

Process : 실행 중인 프로그램 - 운영체제에서 실행하는 단위

Thread : Process 내에서 수행 중에 다른 Thread를 수행할 수 있는 작업 단위

- 스레드를 별도로 실행시킬 수는 없습니다.

- 스레드는 수행 중에 다른 스레드를 수행할 수 있기 때문에 쉬는 동안에 다른 작업을 할 - 수 있습니다.

- 네트워크 작업이나 파일 입출력 등 중간중간 수는 시간이 생기는 작업들은 스레드를 이용하면 쉬는 시간에 다른 작업을 처리할 수 있어서 효율적입니다.

- 이러한 이유로 안드로이드에서는 네트워크 작업을 할 때 Thread를 이용하지 않으면 안되도록 되어 있습니다.


1. Thread 관련 클래스

java.lang.Thread 클래스

java.lang.Runnable 인터페이스


2. Thread 생성 방법

1) Thread 클래스를 상속하는 경우

- run 메소드를 overriding 해서 스레드로 수행할 내용을 작성

- 인스턴스를 생성한 후 start()를 호출

2) Runnable 인터페이스를 구현하는 경우

- run 메소드를 overriding 해서 스레드로 수행할 내용을 작성

- 인스턴스를 생성하고 이 인스턴스를 Thread의 생성자에 대입해서 Thread 객체를 만든 후 Thread 객체가 start()를 호출해야 합니다.

3) 상속이나 구현을 하는 경우에는 anonymous 객체를 이용할 수 있습니다.

4) 메소드가 하나만 존재하는 인터페이스를 구현할 때는 람다식으로도 가능합니다.


실습 : 1초마다 자신의 이름을 출력하는 스레드를 생성해서 실행.

package threadtest;


//Thread로부터 상속받는 클래스

class ThreadEx extends Thread{

@Override //아래 메소드가 overriding 된 메소드라는 것을 알려준다. 어노테이션이라고 한다. 그래서 메소드 이름이 틀리면 오류가 난다.

public void run() {

for(int i=0; i<10;i++) {

//1초 대기

try {

Thread.sleep(1000);

//스레드 이름 출력

System.out.println(this.getName());

} catch (Exception e) {

e.printStackTrace();

}

}

}

}


public class ThreadTest {


public static void main(String[] args) {

//스레드 객체 생성

Thread thread1 = new ThreadEx();

//스레드 실행

thread1.start();

//익명객체를 이용하는 방법 - 보통은 따로 클래스를 만들지 않고 이 방법을 씁니다.

Thread thread2 = new Thread() {

@Override

public void run() {

for(int i=0; i<10;i++) {

try {

Thread.sleep(1000);

System.out.println(getName());

}catch(Exception e) {

}

}

}

};

thread2.start();

//Runnable 인터페이스를 implements - Runnable 객체를 이용해서 스레드 객체를 생성하고 start()를 호출할 수 있음.

Runnable r = new Runnable() {

@Override

public void run() {

for(int i = 0; i<10;i++) {

try {

Thread.sleep(2000);

System.out.println(i);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

};

Thread thread3 = new Thread(r);

thread3.start();

}



3. Daemon Thread

- 다른 스레드가 수행 중이 아니면 자동으로 종료되는 스레드

- 백그라운드 작업에 많이 사용합니다.

- 데이터를 다운로드 받는 작업에 많이 사용함.

- 게임에서 게임 도중 점수 전송 등에도 이용.

- 만드는 방법

- start()를 호출하기 전에 setDaemon(true)를 대입하면 됩니다.

package threadtest;


//Thread로부터 상속받는 클래스

class ThreadEx extends Thread{

@Override //아래 메소드가 overriding 된 메소드라는 것을 알려준다. 어노테이션이라고 한다. 그래서 메소드 이름이 틀리면 오류가 난다.

public void run() {

for(int i=0; i<10;i++) {

//1초 대기

try {

Thread.sleep(1000);

//스레드 이름 출력

System.out.println(this.getName());

} catch (Exception e) {

e.printStackTrace();

}

}

}

}


public class ThreadTest {


public static void main(String[] args) {

//스레드 객체 생성

Thread thread1 = new ThreadEx();

//스레드 실행

thread1.start();

//익명객체를 이용하는 방법 - 보통은 따로 클래스를 만들지 않고 이 방법을 씁니다.

Thread thread2 = new Thread() {

@Override

public void run() {

for(int i=0; i<10;i++) {

try {

Thread.sleep(1000);

System.out.println(getName());

}catch(Exception e) {

}

}

}

};

thread2.start();

//Runnable 인터페이스를 implements - Runnable 객체를 이용해서 스레드 객체를 생성하고 start()를 호출할 수 있음.

Runnable r = new Runnable() {

@Override

public void run() {

for(int i = 0; i<10;i++) {

try {

Thread.sleep(2000);

System.out.println(i);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

};

Thread thread3 = new Thread(r);

//데몬으로 설정 - 다른 스레드가 없으면 자동 중지됩니다.

thread3.setDaemon(true);

thread3.start();

}

- 다른 스레드가 종료되면 thread3도 멈춤.


ajax는 애초에 느린 작업이다. ajax도 중간 중간에 데이터를 받아오므로 thread와 ajax를 많이 쓰면 속도가 느려진다.

'JAVA 공책 > 수업 메모' 카테고리의 다른 글

List  (0) 2018.09.04
Data Structure(자료구조)  (0) 2018.09.03
StringBuilder  (0) 2018.08.30
String 클래스  (0) 2018.08.29
java lang 패키지  (0) 2018.08.28