[자바 멀티스레딩 설명-1부] 멀티스레딩을 이해하려면 이 글이면 충분하다

서문: 오늘날 인터넷 산업에서 멀티스레딩 기술은 매우 중요한 기술이 되었습니다. 컴퓨터 하드웨어의 발전과 함께 점점 더 많은 프로그래머들이 멀티스레딩을 통해 프로그램 성능을 향상시키기 위해 멀티스레딩 기술에 주목하고 있습니다. 널리 사용되는 프로그래밍 언어인 Java는 풍부한 멀티스레딩 지원도 제공합니다. 이 글에서는 자바 멀티스레딩의 기본 개념, 원리, 구현 방법, 생활 속 응용 등을 자세히 소개하여 독자들이 자바 멀티스레딩 기술을 더 잘 이해하고 숙달할 수 있도록 돕습니다.

여기에 이미지 설명을 삽입하세요.

멀티스레딩 소개

당신이 부엌에서 요리를 하고 있는데 동시에 두 가지 다른 요리를 볶어야 한다고 가정해 보세요. 이 시나리오에서는 자신을 스레드로 생각할 수 있으며 이 두 접시는 다른 두 스레드를 나타냅니다.

첫 번째 야채를 볶을 때는 야채를 먼저 자르고 냄비에 기름을 두른 다음 냄비에 야채를 넣고 볶습니다. 각 단계를 순서대로 수행해야 하기 때문에 이는 일반적인 직렬 프로세스입니다. 그러나 두 번째 요리를 튀길 때 여전히 이런 식으로 한다면 두 번째 요리를 시작하기 전에 첫 번째 요리가 모든 단계를 완료할 때까지 기다려야 합니다. 이는 분명히 비효율적입니다.

이런 경우에는 멀티스레딩을 사용하면 효율성을 높일 수 있습니다. 첫 번째 요리를 튀기는 동안 두 번째 요리의 재료를 미리 준비할 수 있습니다. 첫 번째 요리가 냄비에서 볶는 동안 야채 다지기, 기름 가열 등 두 번째 요리 처리를 시작할 수 있습니다. 이렇게 하면 많은 시간을 절약할 수 있습니다.

프로그래밍에도 동일한 원칙이 적용됩니다. 단일 스레드의 경우 프로그램에 여러 작업이 포함되어 있으면 다음 작업을 시작하기 전에 한 작업이 완료될 때까지 기다려야 합니다. 멀티스레딩의 경우 서로 다른 작업을 서로 다른 스레드에 할당하여 동시에 실행할 수 있습니다. 이를 통해 프로그램의 효율성을 크게 높일 수 있습니다.여기에 이미지 설명을 삽입하세요.

스레드 생성

1. Thread 클래스를 상속하고 run() 메서드를 재정의합니다.

먼저 Thread 클래스를 상속하고 run() 메서드를 재정의하는 클래스를 만들고, run 메서드에 이 스레드가 실행할 코드를 작성합니다.

class thread extends Thread{
    
    
    @Override
   public void run(){
    
    
        //thread.currentThread().getName()得到当前线程的名字
        System.out.println("线程启"+thread.currentThread().getName()+"动了");
    }
}

그런 다음 객체를 생성하고 start 메서드를 호출하여 스레드를 시작합니다.

  public static void main(String[] args) {
    
    
        thread thread = new thread();
        thread.start();
    }

작업 결과
이미지 설명을 추가해주세요

Runnable 인터페이스를 구현하고 run() 메서드를 구현합니다.

먼저 Runnable 인터페이스를 구현하는 클래스를 만든 다음 run() 메서드를 구현합니다.

class thread1 implements Runnable{
    
    
    public void run(){
    
    
        System.out.println("线程启"+thread.currentThread().getName()+"动了");
    }
}

다른 Thread 객체를 생성하고 Runnable 인터페이스를 구현한 객체를 매개변수로 전달합니다. 또한 start 메소드를 통해 스레드를 시작하십시오.

  Thread thread1 = new Thread(new thread1());
        thread1.start();

참고 두 방법 모두 run 메서드를 통해 직접 스레드를 시작하지 마십시오. run 메서드를 직접 호출하면 동일한 스레드에서 작업만 수행되며 스레드가 생성되지 않습니다. new thread; 실제로 start 메소드가 호출되면 먼저 스레드가 생성되고 run 메소드가 실행됩니다.

비교하다

두 번째 방법을 사용하는 것이 좋습니다. 요리의 예를 들어보겠습니다. 지금 두 가지 요리를 요리한다고 가정해 보겠습니다. 하나는 볶음이고 다른 하나는 피자입니다. 첫 번째 방법을 사용하는 경우 Thread를 상속하기 위해 두 개의 클래스를 만들어야 합니다.

public class Main {
    
    

    public static void main(String[] args) {
    
    
        CookFriedRice cookFriedRice = new CookFriedRice();
        CookPizza cookPizza = new CookPizza();
        cookFriedRice.start();
        cookPizza.start();


    }

}

class CookFriedRice extends Thread{
    
    
    @Override
   public void run(){
    
    
        System.out.println("开始炒菜了!!!");
    }
}
class CookPizza extends Thread{
    
    
    @Override
    public void run(){
    
    
        System.out.println("开始做披萨了!!!");
    }
}

스레드를 생성하기 위해 Runnable 인터페이스를 구현한다면 Runnable 인터페이스를 구현하는 클래스 두 개만 정의하면 되는데, 클래스도 두 개 생성하면 되는 거 아닌가요? ? ? 여기에서 람다 표현식을 사용할 수 있습니다(낯선 친구들도 이 글을 읽을 수 있습니다람다 표현식)

public class Main {
    
    

    public static void main(String[] args) {
    
    

        new Thread(()-> System.out.println("开始炒菜了!!!")).start();
        new Thread(()-> System.out.println("开始做披萨了!!!")).start();

    }

}

코드가 훨씬 간단하고 서로 다른 스레드가 동일한 개체를 작동하여 정보 공유를 달성할 수 있습니까?

public class Main {
    
    

    public static void main(String[] args) {
    
    
        test test = new test();
        Thread thread1 = new Thread(test);
        Thread thread2 = new Thread(test);
        thread1.start();
        thread2.start();

    }

}

class test implements Runnable {
    
    
    private int count = 0;

    public void run() {
    
    
        count++;
        System.out.println(count);
    }
}

이미지 설명을 추가해주세요

3. 스레드 상태

스레드 상태 및 수명 주기
Java의 스레드에는 6가지 상태, 즉 신규, 실행 가능, 실행 중, 차단됨, 대기 중, 종료됨이 있습니다. 스레드의 수명 주기에는 신규, 준비, 실행, 차단, 대기 및 종료의 단계가 포함됩니다.
여기에 이미지 설명을 삽입하세요.
이해를 돕기 위해 요리의 예를 들어 보겠습니다.
주방에서 셰프는 요리를 준비하고 있으며 각 셰프는 독립적인 태스크 프로세서(일명)와 같습니다. 실). 그들은 모두 자신만의 작업 목록을 가지고 있으며 자신의 순서대로 작업을 수행합니다.
셰프의 생활 상태는 다음 단계로 나눌 수 있습니다.

새로운 상태(신규): 요리사가 모집되어 해당 주방 영역에 배정되어 일하게 됩니다.
준비 상태(실행 가능): 셰프가 작업을 시작할 준비가 되어 셰프가 작업을 할당할 때까지 기다립니다.
차단됨: 주방용품이 치워지기를 기다리는 동안 등 다른 셰프가 셰프를 일시적으로 차단했습니다.
실행 상태(Running): 셰프가 요리 준비를 시작합니다.
종료됨: 요리사가 작업을 완료하고 주방을 떠났습니다.

세부 정보:
실제로 스레드 호출이 시작된 후 할당된 시스템에 따라 프로그램이 멀리 이동할 수도 있고 그렇지 않을 수도 있습니다. 이 스레드 시간(Java 사양에서는 이동을 별도의 상태로 간주하지 않으며 실행 중인 스레드도 이동 상태일 수 있음) 시스템은 각 스레드에 시간 조각을 할당합니다. 시간 조각이 모두 소모되면 CPU는 다음 스레드에 실행 기회를 주는데, 이 프로세스가 매우 빠르기 때문에 전환 프로세스를 감지할 수 없으므로 이러한 스레드가 동시에 실행되는 것처럼 보입니다. 비디오를 프레임별 사진과 비교할 수 있습니다.
다음은 몇 가지 방법입니다.
1.yield (정적 방법)
스레드가 실행 중일 때 실행할 기회는 다음과 같습니다. 포기. 다른 스레드(comity)에 주지만 호의가 성공하지 못할 수 있습니다. 단지 CPU에 실행 권한을 부여하고 CPU 일정을 다시 잡도록 합니다.
2. Join
이 방법 스레드를 차단하고 하위 스레드가 종료될 때까지 기다릴 수 있습니다.
예시 보기

public class Main {
    
    

   public static void main(String[] args) throws InterruptedException {
    
    


       Thread thread1 = new Thread(()-> {
    
    
           for (int i = 0; i < 100; i++) {
    
    
               System.out.println(i+": 子线程在运行!!!");
           }
       });
       thread1.start();
       for (int i = 0; i <100 ; i++) {
    
    
           System.out.println(i+": 主线程在运行!!!");
       }




   }


실행 결과
여기에 이미지 설명을 삽입하세요.
하위 스레드와 메인 스레드가 동시에 실행됩니다.

public class Main {
    
    

    public static void main(String[] args) throws InterruptedException {
    
    


        Thread thread1 = new Thread(()-> {
    
    
            for (int i = 0; i < 100; i++) {
    
    
                System.out.println(i+": 子线程在运行!!!");
            }
        });
        thread1.start();
        for (int i = 0; i <100 ; i++) {
    
    

            if(i%2==0)
                thread1.join();
            System.out.println(i+": 主线程在运行!!!");
        }
        
    }

}

여기에 이미지 설명을 삽입하세요.
조인을 추가한 후 메인 스레드는 실행되기 전에 하위 스레드가 완료될 때까지 기다립니다.

이번 호는 여기까지입니다. 글이 좋다고 생각하시면 다음 호를 주목해 주시면 됩니다.
다음 호 미리보기:

  • 스레드 동기화 및 상호 배제
  • 스레드 간 통신
  • 스레드 풀 사용
  • 자바 멀티스레딩을 생활에 적용하다

이미지 설명을 추가해주세요

추천

출처blog.csdn.net/weixin_55939638/article/details/134574254