1) Thread 라는 클래스를 상속(extends) 받음
2) run() 메서드를 재정의 - 스레드 구현
3-1) Thread 클래스 객체 생성
3-2) 참조변수.start() 메서드를 호출
==> start() 메서드를 호출하면 run() 메서드를 실행함
1) Runnable 인터페이스를 구현(implements)
2) run() 추상 메서드를 재정의
3) 스레드 클래스(자식클래스) 객체 생성
4) Thread 라는 클래스 객체 생성
==> 생성자(인자생성자) 안에 스레드 클래스(자식클래스)의 참조변수를 기재
5) Thread 라는 클래스의 참조변수.start() 메서드 호출
=============================코드=============================
class Thread1 extends Thread { // 1-1) 스레드를 상속 받음
@Override
public void run() { // 1-2) run()메서드 재정의
int i = 1;
while(true) { // 무한 반복
System.out.println("i >>> " + i);
i++;
}
}
}
class Thread2 extends Thread {
@Override
public void run() {
int j = 1;
while(true) { // 무한 반복
System.out.println("j >>> " + j);
j++;
}
}
}
public class Thread_02 {
public static void main(String[] args) {
// 3-1) 재정의한 Thread 클래스 객체를 생성
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
// 3-2) 참조변수.start() 메서드 호출
thread1.start(); thread2.start(); // run() 메서드 실행
}
}
i와 j의 값이 번갈아가며 무한반복으로 출력됨

=============================코드=============================
class Runnable1 implements Runnable { // 2-1) Runnalble 인터페이스 구현
@Override
public void run() { // 2-2) run() 추상 메서드 재정의
int i = 1;
while(true) { // 무한 반복
System.out.println("i >>> " + i);
i++;
}
}
}
class Runnable2 implements Runnable {
@Override
public void run() {
int j = 1;
while(true) { // 무한 반복
System.out.println("j >>> " + j);
j++;
}
}
}
public class Thread_03 {
public static void main(String[] args) {
// 2-3) 스레드 클래스(자식클래스) 객체 생성
Runnable1 runnable1 = new Runnable1();
Runnable2 runnable2 = new Runnable2();
// 2-4) Thread 라는 클래스 객체 생성
// ==> 생성자(인자생성자) 안에 스레드 클래스(자식클래스)의 참조변수를 기재
Thread thread1 = new Thread(runnable1); // 자식 클래스인 runnable1을 thread1의 참조 변수로 넣어줌
Thread thread2 = new Thread(runnable2);
// 2-5) Thread 라는 클래스의 참조변수.start() 메서드 호출
thread1.start(); thread2.start();
}
}
i와 j의 값이 번갈아가며 무한반복으로 출력됨
