2d3k / CS-Study

기본을 소홀히 하지 말자!!
0 stars 1 forks source link

[JAVA] 싱글 스레드와 멀티 스레드 #1

Open 2d3k opened 1 year ago

2d3k commented 1 year ago

1. 둘의 차이를 설명하시오.

2. 자바로 구현하시오.

2d3k commented 1 year ago
  1. 스레드는 프로세스가 할당받은 자원을 이용하는 실행 단위를 뜻한다.

싱글스레드는 프로세스가 단일 스레드로 동작하는 방식이다. 자원을 공유하지 않기 때문에 동기화를 신경쓸 필요가 없고,문맥을 교환할 필요가 없다. 하나의 물리적 코어만 사용하기 때문에 CPU 사용을 최적화 할 수 없는 단점이 있다.

멀티스레드는 두 개 이상의 스레드가 프로세스 내부에서 자원을 공유하며 작업을 수행한다. 프로세스에 비해 레지스터와 스택만 교환하고 공유 자원은 교환하지 않아도 돼서 문맥 교환이 빠르고, CPU를 병렬로 효율적으로 사용할 수 있다. 둘 이상의 스레드가 동시에 실행하며 문제를 일으키는 임계영역과 둘 이상의 스레드에서 공유자원에 접근할 때 다른 스레드에서 사용중인 값을 읽어올 경우 동기화 문제가 발생할 수 있다는 단점이 있다.

문맥 교환 (Context Switching)

CPU가 한 개의 Task를 실행하고 있는 상태에서 다른 Task로 실행이 전환되는 과정에서 기존의 Task 상태 및 Register 값들에 대한 정보(문맥, Context)를 저장하고 새로운 Task의 정보(문맥, Context)으로 교체하는 작업을 말합니다. 이때 Task(프로세스/스레드)의 정보는 레지스터에 저장되며 PCB로 관리됩니다

2d3k commented 1 year ago

Single

import java.util.Scanner;

public class MySingleThreadedProgram {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter a number: ");
        int num1 = scanner.nextInt();

        System.out.print("Enter another number: ");
        int num2 = scanner.nextInt();

        int sum = num1 + num2;

        System.out.println("The sum of " + num1 + " and " + num2 + " is " + sum);
    }
}

이 코드에서는 메인 메서드로 메인 스레드를 실행시키는 싱글 스레드이다. 코드는 간단히 “hello world”를 터미널에서 콘솔로 출력하는 내용이다. 싱글 스레드이기 때문에 메인 메서드와 같이 동시에 실행되는 다른 스레드가 없다.

Muti

public class MyMultithreadedProgram {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyRunnable("Thread 1"));
        Thread thread2 = new Thread(new MyRunnable("Thread 2"));

        thread1.start();
        thread2.start();
    }
}

class MyRunnable implements Runnable {
    private String name;

    public MyRunnable(String name) {
        this.name = name;
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + ": " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

멀티스레드 클래스는 두개의 스레드를 만들고 start() 메서드를 사용해 스레드를 실행시킨다. 각 스레드는 실행 가능한 인터페이스를 구현하고 스레드의 동작을 정의하는 MyRunnable 클래스의 인스턴스를 실행한다. run() 메서드는 스레드 이름과 0부터 4까지의 숫자가 포함된 메시지를 출력한 후, 다음 메시지를 인쇄하기 전에 1초 동안 절전 모드로 전환합니다. 두 스레드가 동시에 실행되기 때문에 출력이 인터리브되고 병렬로 실행되는 것을 볼 수 있다.

made by GPT

hyeonayou commented 1 year ago
  1. 싱글 스레드란 프로세스 내에 하나의 스레드만 동작하는 방식입니다. 동기화를 고려하지 않고, 컨텍스트 스위칭 작업을 요구하지 않기에 성능 부분에서 멀티 쓰레드보다 좋다는 장점을 가집니다. 멀티 스레드란 프로세스 내에 두 개 이상의 스레드가 동작하는 방식으로 서로 컨텍스트 스위칭 과정을 거쳐 데이터를 처리합니다. 프로그램 일부분에 에러가 발생하여도 새로운 스레드를 생성하여 동작하기에 프로그램이 멈추지 않고 수행되어 응답성이 증가 한다는 장점이 있습니다.

public class Thread {

public static void main(String[] args) {

    for(int i=0; i <500; i++){
        System.out.print(1);
    }

    for(int j=0; j <500; j++){
        System.out.print(2);
    }

}

}