** 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 |