충분히 쌓여가는
쓰레드의 구현과 실행 본문
쓰레드의 구현
① Thread 클래스를 상속
class MyThread extends Thread {
public void run() { // Thread 클래스의 run()을 오버라이딩
/* 작업내용 */
}
}
MyThread t1 = new MyThread(); // 쓰레드의 생성
t1.start(); // 쓰레드의 실행
② Runnable 인터페이스를 구현
class MyThread2 implements Runnable {
public void run() { // Runnable 인터페이스의 추상메서드 run()을 구현
/* 작업내용 */
}
}
Runnable r = new MyThread2();
Thread t2 = new Thread(r); // Thread(Runnable r)
// Thread t2 = new Thread(new MyThread2());
t2.start();
코드
싱글 쓰레드
class ThreadTest {
public static void main(String args[]) {
for(int i=0; i < 5; i++) {
System.out.println(0);
}
for(int i=0; i < 5; i++) {
System.out.println(1);
}
}
}
0
0
0
0
0
1
1
1
1
1
멀티쓰레드
class ThreadTest {
public static void main(String args[]) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r); // 생성자 Thread(Runnable target)
t1.start();
t2.start();
}
}
class ThreadEx1_1 extends Thread { // Thread 클래스를 상속해서 쓰레드를 구현
public void run() { // 쓰레드가 수행할 작업을 작성
for(int i=0; i < 5; i++) {
System.out.println(this.getName()); // 조상인 Thread의 getName()을 호출, this 생략 가능
}
}
}
class ThreadEx1_2 implements Runnable { // Runnable 인터페이스를 구현해서 쓰레드를 구현
public void run() { // 쓰레드가 수행할 작업을 작성
for(int i=0; i < 5; i++) {
// Thread.currentThread() - 현재 실행중인 Thread를 반환한다.
System.out.println(Thread.currentThread().getName());
}
}
}
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
쓰레드가 작업을 따로 돌리는 것 확인
class ThreadTest {
public static void main(String args[]) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r); // 생성자 Thread(Runnable target)
t1.start();
t2.start();
}
}
class ThreadEx1_1 extends Thread { // Thread 클래스를 상속해서 쓰레드를 구현
public void run() { // 쓰레드가 수행할 작업을 작성
for(int i=0; i < 500; i++) {
System.out.print(0);
}
}
}
class ThreadEx1_2 implements Runnable { // Runnable 인터페이스를 구현해서 쓰레드를 구현
public void run() { // 쓰레드가 수행할 작업을 작성
for(int i=0; i < 500; i++) {
System.out.print(1);
}
}
}
만약 싱글쓰레드로 돌리면 절대 섞이지 않는다
class ThreadTest {
public static void main(String args[]) {
for(int i=0; i < 500; i++) {
System.out.print(0);
}
for(int i=0; i < 500; i++) {
System.out.print(1);
}
}
}
쓰레드의 실행 - start()
쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다
start() 했다고 즉시 실행되는 것은 아님(OS 스케줄러가 실행순서를 결정한다)
ThreadEx1_1 t1 = new ThreadEx1_1(); // 쓰레드 t1을 생성한다
ThreadEx1_1 t2 = new ThreadEx1_1(); // 쓰레드 t2을 생성한다
t1.start(); // 쓰레드 t1을 실행시킨다
t2.start(); // 쓰레드 t2를 실행시킨다
코드
0을 출력하는 부분에서 start()를 했다고 0이 출력되는 것이 아닌 1이 먼저 출력될 수도 있다
class ThreadTest {
public static void main(String args[]) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r); // 생성자 Thread(Runnable target)
t1.start(); // 0출력
t2.start(); // 1출력
}
}
class ThreadEx1_1 extends Thread { // Thread 클래스를 상속해서 쓰레드를 구현
public void run() { // 쓰레드가 수행할 작업을 작성
for(int i=0; i < 500; i++) {
System.out.print(0);
}
}
}
class ThreadEx1_2 implements Runnable { // Runnable 인터페이스를 구현해서 쓰레드를 구현
public void run() { // 쓰레드가 수행할 작업을 작성
for(int i=0; i < 500; i++) {
System.out.print(1);
}
}
}
start()와 run()
run()을 작성했는데 왜 start()를 호출하는지에 대한 의문점
class ThreadTest {
public static void main(String args[]) {
MyThread t1 = new MyThread(); // 1. 생성
t1.start(); // 2. 실행
}
}
class MyThread extends Thread {
public void run() {
// ...
}
}
'Java > JAVA3' 카테고리의 다른 글
싱글 쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹(blocking) (0) | 2023.08.03 |
---|---|
main 쓰레드 (0) | 2023.08.03 |
thread 쓰레드 (0) | 2023.08.02 |
애너테이션 타입 정의하기, 애너테이션의 요소 (0) | 2023.08.01 |
메타 애너테이션 (0) | 2023.08.01 |