하나의 프로세스가 가질 수 있는 쓰레드의 개수는 제한되어 있지 않으나 쓰레드가 작업을 수행하는데 개별적인 메모리공간을 필요로 하기 때문에 쓰레드는 메모리 공간과 의존적인 관계라는 것만 알아두자 (두뇌보호 차원) 😝
한 번 사용한 쓰레드는 다시 재사용할 수 없다. 다시 말해 하나의 쓰레드에 대해 start()가 한 번만 호출된다는 뜻이다.
Thread th1 = new Thread();
th1.start()
th1.start() ---> 이렇게 호출할 수 없다.
Thread th1 = new Thread();
th1.start()
Thread th2 = new Thread();
th2.start() ---> 하나의 새로운 쓰레드를 생성하여 사용할 수 있다.
public class ThreadTest extends Thread{
}
public class ThreadTest implements Runnable{
@Override
public void run() {
// Runnable 인터페이스를 구현하기 위해 자동으로 생성되는 run()메소드
}
}
위와 같이 두 가지 방법 중 어느 쪽을 사용해도 사실 별 문제는 읎다..
다만 일반적으로 자주 사용하는 방법은 Runnable 인터페이스를 구현하는 방법이다.
어쨋든 우리는 Thread와 Runnable 인터페이스 안에 있는 run() 내용만 채워주면 된다.
그 후 start() 메소드 호출만 해주면 작업을 시작한다.
public class Main {
public static void main(String[] args) {
new ThreadTest1().start();
ThreadTest2 threadTest2 = new ThreadTest2();
Thread thread = new Thread(threadTest2);
thread.start();
}
}
public class ThreadTest1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("extend Thread : " + getName() + i);
}
}
}
public class ThreadTest2 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("implement Thread : " + Thread.currentThread().getName() + i);
}
}
}
extend Thread : Thread-00
extend Thread : Thread-01
extend Thread : Thread-02
implement Thread : Thread-10
implement Thread : Thread-11
implement Thread : Thread-12
implement Thread : Thread-13
implement Thread : Thread-14
extend Thread : Thread-03
extend Thread : Thread-04
Thread 클래스를 상속받은 경우와 Runnable 인터페이스를 구현한 경우의 객체를 생성하는 방법이 조금 다르다
Thread 클래스를 상속받으면 Thread 클래스의 메소드를 직접 호출 할 수 있지만, Runnable을 구현하면 Thread 클래스의 static 메소드인 currentThread()를 호출하여 쓰레드에 대한 참조를 얻어 와야 호출이 가능하기 때문이다.
Thread currentThread() - 현재 실행중인 쓰레드의 참조를 반환한다.
String getName() - 쓰레드의 이름을 반환한다