Java(자바)-Thread(스레드) 사용법
Thread(스레드)란?
동작하고 있는 프로그램을 프로세스라고 한다.
보통 한 개의 프로세스는 한 가지 일을 하지만 스레드는 두 가지 이상의 일을 동시에 할 수 있다.
스레드 구현하기 위해서는 스레드 클래스를 구현해야 한다.
스레드 클래스는 상속으로 Thread 를 상속하여 구현할 수 있다.
public class MainThread extends Thread{
private int a;
// 생성자를 통해 매개변수 전달
public MainThread(int a) {
this.a = a;
}
@Override
public void run() {
System.out.println("현재 스레드: "+a);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i=0;i<10;i++) {
MainThread mainThread = new MainThread(i);
mainThread.start();
}
System.out.println("메인종료");
}
}
run 메서드 안에서 구현하고자 하는 기능을 구현하면 동시에 동작하도록 만들 수 있다.
스레드를 동작하게 하기 위해서는 스레드클래스이름.start() 메서드를 통해 만든 스레드 클래스를 실행할 수 있다.
위코드 실행 시키면
메인종료
현재 스레드: 3
현재 스레드: 0
현재 스레드: 9
현재 스레드: 8
현재 스레드: 6
현재 스레드: 4
현재 스레드: 5
현재 스레드: 2
현재 스레드: 7
현재 스레드: 1
이런식으로 순서대로 번호가 출력되지 않는다.
sleep 사용법
스레드가 일정 시간 동안 코드가 진행되지 않도록 하는 메서드
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
// TODO: handle exception
}
이렇게 사용할수 있으면 1초 동안 스레드가 진행을 멈출 수 있다.
join 사용법
앞의 코드들을 실행시켜보면 분명 마지막에 " 메인 종료"라는 코드를 작성했지만 "메인 종료"가 스레드로 동작하는 코드보다 먼저 나타난다. 이 말은 main에 작성된 것이 먼저 종료되어 버린 걸 의미하는데 join을 이용하면 스레드가 종료될 때까지 대기하고
main을 종료 할 수 있다.
package study;
import java.util.ArrayList;
public class MainThread extends Thread{
private int a;
// 생성자를 통해 매개변수 전달
public MainThread(int a) {
this.a = a;
}
@Override
public void run() {
System.out.println("현재 스레드: "+a);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Thread> threads = new ArrayList<Thread>();
for (int i=0;i<10;i++) {
MainThread mainThread = new MainThread(i);
mainThread.start();
threads.add(mainThread);
}
for(int i=0; i<threads.size(); i++) {
Thread t = threads.get(i);
try {
t.join(); // t 쓰레드가 종료할 때까지 기다린다.
}catch(Exception e) {
}
}
System.out.println("메인종료");
}
}
Runnable 인터페이스로 정의한 스레드
사용하는 이유는 다중 상속을 위해서 인터페이스로 정의하여 사용할 수 있다.
package studyThread;
import java.util.ArrayList;
public class RunnableThread implements Runnable{
private int a;
// 생성자를 통해 매개변수 전달
public RunnableThread(int a) {
this.a = a;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("현재 스레드: "+a);
}
}
// 다른 메인 클래스에서
public static void main(String[] args) {
// TODO Auto-generated method stub
RunnableThread rt=new RunnableThread(10);
Thread m_Thread =new Thread(rt);
m_Thread.start();
}
이렇게 사용 할 수 있으면 결과값은
현재 스레드 10 이 나온다.
반응형