본문 바로가기

2023.11.21-2024.05.31

240103 JAVA Thread

//2024-01-03 웹 서버프로그램 구현
//Thread p520
//Thread, IO, Net, GUI
//프로젝트 제작,(자바, DB)

/*

* 프로세스 : 운영체제에서는 실행중인 하나의 어플리케이션을 프로세스라고 합니다.
사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아
애플리케이션의 코드를 실행하는 것이 프로세스입니다.

* 스레드 : 운영체제는 두가지 이상의 작업을 동시에 처리하는 멀티 테스킹을 할 수 있도록 CPU 및
* 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킵니다.
*

* 스레드 생성과 실행
* 1. Runnable 인터페이스를 구현하는 방법(구현하다)
* 2. Thread 클래스를 상속받는 방법(확장하다)

*

* 왜 두 개?
* 다른 클래스가 상속 중이라면 Thread 클래스를 상속받지 못한다. 이럴때를 대비해서 인터페이스 Runnable이
* 만들어져 있다. (Thread 클래스를 상속해서 제작하는 것이 편하다.)

*
* 실행은 start()로 실행

* */

 

 
 

ThreadEx

1
2
3
4
5
6
7
8
9
public class ThreadEx extends Thread{
    public void run() {
        //super.run();
        System.out.println("Thread 시작");
    }
    public static void main(String[] args) {
        ThreadEx th01 = new ThreadEx();
        th01.start();
        
cs

 

Thread 시작

 

 

  1. ThreadEx 클래스는 Thread 클래스를 상속받습니다.
  2. run 메소드는 스레드가 실행될 때 수행되는 부분으로, 여기에 원하는 작업을 구현할 수 있습니다. 현재 코드에서는 "Thread 시작"이라는 메시지를 출력하고 있습니다.
  3. main 메소드에서는 ThreadEx 클래스의 객체를 생성한 후 start 메소드를 호출하여 새로운 스레드를 시작합니다.
    • start 메소드는 내부적으로 run 메소드를 호출하며, 스레드가 별도로 실행되게 합니다.

 

Thread02

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.sukgi.thread;
 
public class Thread02 extends Thread {
    int seq;
    
    public Thread02(int seq) {
        this.seq = seq;
    }
    
    @Override
    public void run() {
        System.out.println(this.seq + "스레드 시작");
        try {
            Thread.sleep(1000);//1초 = 1000
            
        } catch (InterruptedException e) {
            
            e.printStackTrace();
        }
    System.out.println(this.seq + "스레드 끝");
    
    
    }
    
 
    public static void main(String[] args) {
        
        System.out.println("main 메소드 시작");
 
        for (int i = 0; i < 10; i++) {
            Thread02 th02 = new Thread02(i);
            th02.start();
            
        } 
        System.out.println("main 메소드 끝");
 
    }
 
}
 
cs

 

main 메소드 시작

0스레드 시작

2스레드 시작

1스레드 시작

7스레드 시작

main 메소드 끝

3스레드 시작

5스레드 시작

6스레드 시작

4스레드 시작

9스레드 시작

8스레드 시작

8스레드 끝

4스레드 끝

0스레드 끝

7스레드 끝

5스레드 끝

6스레드 끝

3스레드 끝

9스레드 끝

2스레드 끝

1스레드 끝

 

  1. Thread02 클래스 정의:
    • Thread02 클래스는 Thread 클래스를 상속받아 스레드를 생성하는 역할을 합니다.
    • 클래스 내에 int seq라는 변수가 선언되어 있으며, 이는 스레드의 일련번호를 나타냅니다.
    • 생성자에서는 전달받은 일련번호를 멤버 변수에 할당합니다.
  2. run 메소드:
    • run 메소드는 스레드가 실행될 때 수행되는 부분입니다.
    • seq 변수를 이용하여 해당 스레드의 시작 메시지를 출력합니다.
    • Thread.sleep(1000)을 사용하여 스레드를 1초 동안 일시 중지시킵니다.
    • InterruptedException이 발생할 경우 예외를 처리하고 에러 메시지를 출력합니다.
    • 1초 동안의 대기 후에 다시 seq 변수를 이용하여 스레드의 종료 메시지를 출력합니다.
  3. main 메소드:
    • main 메소드에서는 "main 메소드 시작" 메시지를 출력합니다.
    • 0부터 9까지의 값을 가지고 Thread02 객체를 생성하고, 각 객체에 대해 start 메소드를 호출하여 스레드를 실행합니다.
    • 이때, 스레드는 별도의 시간을 소비하므로 순서대로 모든 스레드가 시작됩니다. 그러나 각 스레드는 독립적으로 실행되므로 어떤 스레드가 먼저 종료될지는 예측할 수 없습니다.
    • 모든 스레드의 실행이 완료되면 "main 메소드 끝" 메시지를 출력합니다.

이 코드를 실행하면 각 스레드가 1초 동안 일시 중지된 후에 순서와 상관없이 실행되며, "main 메소드 끝" 메시지는 모든 스레드의 실행이 완료된 후에 출력됩니다.

 

Thread03

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.sukgi.thread;
 
import java.util.ArrayList;
import java.util.List;
 
public class Thread03 extends Thread{
    int seq;
    public Thread03(int seq) {
        this.seq = seq;
    }
    
    public void run() {
        System.out.println(this.seq + "스레드 시작");
        
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(this.seq + "스레드 끝");
    }
 
    public static void main(String[] args) {
        System.out.println("main 시작");
        List<Thread> tList = new ArrayList<Thread>();
        for (int i = 0; i < 10; i++) {
            Thread th1 = new Thread03(i);
            th1.start();
            tList.add(th1);
            
        }
        for (int i = 0; i < tList.size(); i++) {
            Thread t = tList.get(i);
            
            try {
                t.join();
            } catch (InterruptedException e) {
                
                e.printStackTrace();
            }
            
        }
        System.out.println("main 끝");
 
    }
 
}
 
cs

 

main 시작

0스레드 시작

1스레드 시작

2스레드 시작

4스레드 시작

5스레드 시작

3스레드 시작

8스레드 시작

7스레드 시작

6스레드 시작

9스레드 시작

4스레드 끝

6스레드 끝

9스레드 끝

5스레드 끝

8스레드 끝

3스레드 끝

2스레드 끝

0스레드 끝

1스레드 끝

7스레드 끝

main 끝

 

  1. Thread03 클래스 정의:
    • Thread03 클래스는 Thread 클래스를 상속받아 스레드를 생성하는 역할을 합니다.
    • 생성자에서 전달받은 일련번호를 멤버 변수에 할당합니다.
    • run 메소드에서는 해당 스레드의 시작 메시지를 출력하고, 1초 동안 스레드를 일시 중지시킵니다. 그 후에는 종료 메시지를 출력합니다.
  2. main 메소드:
    • "main 시작" 메시지를 출력합니다.
    • Thread03 객체들을 생성하여 리스트에 추가합니다.
    • 각각의 스레드를 시작합니다.
    • 스레드들의 실행이 모두 완료될 때까지 기다리기 위해 join 메소드를 사용합니다.
    • t.join()은 해당 스레드가 종료될 때까지 현재 스레드(main 스레드)를 일시 중지시킵니다.
    • 모든 스레드의 실행이 완료되면 "main 끝" 메시지를 출력합니다.

이 코드를 실행하면 각 스레드가 1초 동안 일시 중지된 후에 순서와 상관없이 실행되며, "main 끝" 메시지는 모든 스레드의 실행이 완료된 후에 출력됩니다. join 메소드를 사용함으로써 모든 스레드의 종료를 기다리고 있습니다.

 

 

Thread04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.sukgi.thread;
 
import java.util.ArrayList;
import java.util.List;
 
class A {
 
}
 
public class Thread04 extends A implements Runnable {
    int seq;
 
    public Thread04(int seq) {
        this.seq = seq;
    }
 
    @Override
    public void run() {
        System.out.println(this.seq + "스레드 시작");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
 
            e.printStackTrace();
        }
        System.out.println(this.seq + "스레드 시작");
 
    }
 
    public static void main(String[] args) {
 
        List<Thread> tList = new ArrayList<Thread>();
 
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(new Thread04(i));
            // t의 생성자로 Runnalble을 구현한 객체를 넘긴 모습
 
            t.start();
            tList.add(t);
 
        }
 
        for (int i = 0; i < tList.size(); i++) {
            Thread t = tList.get(i);
            try {
                t.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("메인 메소드 끝.");
 
    }
}
cs

 

4스레드 시작

9스레드 시작

2스레드 시작

6스레드 시작

3스레드 시작

7스레드 시작

8스레드 시작

1스레드 시작

5스레드 시작

0스레드 시작

2스레드 시작

1스레드 시작

8스레드 시작

3스레드 시작

9스레드 시작

7스레드 시작

4스레드 시작

0스레드 시작

5스레드 시작

6스레드 시작

메인 메소드 끝.

 

  1. A 클래스 정의:
    • A 클래스는 다른 클래스에서 상속받거나 인터페이스를 구현하는데 사용되지 않는 일반적인 클래스로 보입니다.
  2. Thread04 클래스 정의:
    • Thread04 클래스는 A 클래스를 상속받고 Runnable 인터페이스를 구현하여 스레드를 생성하는 역할을 합니다.
    • 생성자에서 전달받은 일련번호를 멤버 변수에 할당합니다.
    • run 메소드에서는 해당 스레드의 시작 메시지를 출력하고, 1초 동안 스레드를 일시 중지시킵니다. 그 후에는 종료 메시지를 출력합니다.
  3. main 메소드:
    • 먼저, "main 메소드 시작" 메시지를 출력합니다.
    • Thread04 객체들을 생성하여 리스트에 추가합니다.
    • 각각의 스레드를 시작합니다.
    • 스레드들의 실행이 모두 완료될 때까지 기다리기 위해 join 메소드를 사용합니다.
    • t.join()은 해당 스레드가 종료될 때까지 현재 스레드(main 스레드)를 일시 중지시킵니다.
    • 모든 스레드의 실행이 완료되면 "메인 메소드 끝." 메시지를 출력합니다.

이 코드를 실행하면 각 스레드가 1초 동안 일시 중지된 후에 순서와 상관없이 실행되며, "메인 메소드 끝." 메시지는 모든 스레드의 실행이 완료된 후에 출력됩니다.

'2023.11.21-2024.05.31' 카테고리의 다른 글

240103 JAVA Inner  (0) 2024.01.03
240103 JAVA Queue01  (0) 2024.01.03
231228 HTML BoardDAO.java  (0) 2024.01.02
231228 HTML BoardDTO.java  (0) 2024.01.02
231228 HTML Team.java  (0) 2024.01.02