java.lang.Thread
쓰레드를 생성하는 방법은 두가지가 있다.
둘다 똑같이 run 메서드를 구현하는 과정이다.
또한 Runnable은 메서드가 하나뿐인 함수형 인터페이스 이므로 JAVA8 이상을 사용한다면 람다식을 사용할 수도 있다.
아래는 예시
public class Main {
public static void main(String[] args) {
//Thread 를 상속
Thread myThread1 = new MyThread1();
//Runnable 을 구현
Thread myThread2 = new Thread(new MyThread2());
//람다식으로 Runnable 구현 ( JAVA 8+)
Thread myThread3 = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " start");
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " - " + i);
}
System.out.println(Thread.currentThread().getName() + " end");
});
}
}
class MyThread1 extends Thread{
@Override
public void run() {
System.out.println(this.getName() + " start");
for (int i = 0;i <10;i++){
System.out.println(this.getName() + " - "+i);
}
System.out.println(this.getName() + " end");
}
}
class MyThread2 implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " start");
for (int i = 0;i <10;i++){
System.out.println(Thread.currentThread().getName() + " - "+i);
}
System.out.println(Thread.currentThread().getName() + " end");
}
}
Thread를 상속한 경우 쓰레드의 name을 가져올때 this.getName() 이 가능하지만
Runnable을 구현한 경우 이런식으로 가져올 수가 없다. 이때 Thread.currentThread()를 사용하면 된다.
Java는 다중상속이 안되기 때문에 인터페이스를 사용하는것이 낫다.
실행을 할때는 Thread안의 run()메서드는 직접 호출하면 안된다.
이렇게 되면 실행하는 쓰레드의 호출 스택을 공유하게 된다.
꼭 myThread1.start()
와 같이 start()
메서드를 호출하여 실행한다.
우리가 보통 main 메서드를 실행하게 되는데, 이는 main Thread에서 실행한 것이다.
Thread를 start() 하게 되면 새로운 쓰레드가 만들어 지고 그곳에서 run()이 실행된다.
쓰레드는 스위칭 과정을 통해 번갈아 가며 실행되게 되는데, 이는 운영체제가 담당하게 된다.
즉 운영체제에서 독립적이지 못하다.
실행 순서도 매번 다를 수 있으며, 코드상 위에 있다고 해서 반드시 먼저 실행된다는 보장이 없다.