>  기사  >  Java  >  자바 멀티스레딩이 무슨 뜻인가요?

자바 멀티스레딩이 무슨 뜻인가요?

coldplay.xixi
coldplay.xixi원래의
2020-08-11 13:18:223955검색

Java 멀티스레딩은 다음을 의미합니다. 멀티스레딩은 프로그램에서 여러 명령 스트림을 동시에 실행할 수 있는 메커니즘입니다. 각 명령 스트림은 스레드라고 하며 서로 독립적입니다. 모든 스레드에서 공유됩니다.

자바 멀티스레딩이 무슨 뜻인가요?

Java 멀티 스레딩에 대한 자세한 설명:

1. 멀티 스레딩 이해

멀티 스레딩은 여러 명령어 스트림이 프로그램에서 동시에 실행될 수 있도록 하는 메커니즘입니다. 서로 독립적인 스레드라고 합니다. 스레드는 경량 프로세스라고도 하며 프로세스와 같이 독립적인 실행 제어를 가지며 운영 체제에 의해 예약됩니다. 차이점은 스레드가 독립적인 저장 공간을 갖지 않지만 자신이 속한 프로세스의 다른 스레드와 저장 공간을 공유한다는 것입니다. 이로 인해 스레드 간의 통신이 프로세스의 통신보다 훨씬 간단해집니다.

Java 메모리 모델의 경우 Java가 크로스 플랫폼 언어로 설계되었으므로 메모리 관리 측면에서 통일된 모델이 있어야 한다는 것은 분명합니다. 시스템에는 메인 메모리(Main Memory)가 있습니다. Java의 모든 변수는 메인 메모리에 저장되며 모든 스레드에서 공유됩니다. 각 스레드에는 자체 작업 메모리(작업 메모리)가 있습니다. 작업 메모리에 저장되는 것은 주 메모리에 있는 일부 변수의 복사본입니다. 변수에 대한 모든 스레드 작업은 작업 메모리에서 수행되며 스레드는 서로 직접 액세스할 수 없습니다. , 변수 전송은 메인 메모리를 통해 완료되어야 합니다.

여러 스레드의 실행은 동시적입니다. 즉, 물리적으로 "동시"인지 여부에 관계없이 논리적으로 "동시"입니다. 시스템에 CPU가 하나만 있는 경우 진정한 "동시성"은 불가능합니다. 멀티스레딩과 기존 단일스레딩의 프로그래밍에서 가장 큰 차이점은 각 스레드의 제어 흐름이 서로 독립적이기 때문에 각 스레드 간의 코드가 순서대로 실행되지 않아 스레드 예약, 동기화 및 기타 문제가 발생한다는 것입니다. . 네트워크 관리 네트워크 비트CN.com

관련 학습 권장사항: Java 기본 튜토리얼

2. Java에서 멀티스레딩 구현

새로운 스레드를 생성하기 위해 무엇을 해야 하는지 상상해 보는 것이 좋습니다. ? 분명히, 우리는 이 스레드에 의해 실행될 코드를 지정해야 하며 이것이 Java에서 멀티스레딩을 구현하기 위해 해야 할 전부입니다!

완전한 객체 지향 언어인 Java는 다중 스레드 프로그래밍을 용이하게 하기 위해 java.lang.Thread 클래스를 제공합니다. 이 클래스는 우리가 자체 스레드를 제어하는 ​​데 도움이 되는 많은 메서드를 제공합니다.

그렇다면 스레드가 실행하기를 원하는 코드를 Java에 어떻게 제공합니까? Thread 클래스를 살펴보겠습니다. Thread 클래스의 가장 중요한 메서드는 run()입니다. 이는 Thread 클래스의 start() 메서드에 의해 호출되며 스레드에서 실행할 코드를 제공합니다. 우리 자신의 코드를 지정하려면 코드를 재정의하세요!

방법 1: Thread 클래스를 상속하고 run() 메서드를 다시 작성합니다. 생성된 Thread 클래스의 하위 클래스에 run()을 다시 작성하고 스레드에서 실행할 코드를 추가합니다. 예를 들면 다음과 같습니다.

public class TwoThread extends Thread {
    public void run() {
        for ( int i = 0; i < 10; i++ ) {
            System.out.println("New thread");
        }
    }
    public static void main(String[] args) {
        TwoThread tt = new TwoThread();
        tt.start();
        for ( int i = 0; i < 10; i++ ) {
            System.out.println("Main thread");
        }
    }
}

이 방법은 간단하고 명확하며 모든 사람의 습관에 부합합니다. 그러나 큰 단점도 있습니다. 즉, 우리 클래스가 클래스를 상속한 경우 Thread 클래스를 상속할 수 없다는 것입니다.

방법 2: Runnable 인터페이스 구현

Runnable 인터페이스에는 run()이라는 하나의 메서드만 있습니다. 우리는 클래스가 Runnable 인터페이스를 구현하고 이 메서드를 제공하며 여기에 스레드 코드를 작성하고 이 부분을 완료한다고 선언합니다. 일. 그러나 Runnable 인터페이스는 스레드를 지원하지 않습니다. 이는 Thread 클래스의 생성자 public Thread(Runnable 대상)를 통해 달성됩니다. 예는 다음과 같습니다.

public class MyThread implements Runnable {
int count=1, number;
public MyThread(int num) {
number = num;
System.out.println("创建线程 " + number);
}
public void run() {
while(true) {
System.out.println("线程 " + number + ":计数 " + count);
if(++count== 6) return;
}
}
public static void main(String args[]) {
for(int i = 0; i < 5; i++)
new Thread(new MyThread(i+1)).start();
}
}

Runnable 인터페이스를 사용하여 멀티스레딩을 구현하면 모든 코드를 하나의 클래스에 포함할 수 있어 캡슐화에 도움이 됩니다.

3. 스레드의 네 가지 상태

1. 새로운 상태: 스레드가 생성되었지만 아직 실행되지 않았습니다(start()가 아직 호출되지 않았습니다).

2. 실행 가능 상태: 스레드가 실행될 수 있지만 반드시 실행될 필요는 없습니다. CPU 시간은 언제든지 이 스레드에 할당되어 실행되도록 할 수 있습니다.

3. 차단된 상태: 스레드에 CPU 시간이 할당되지 않고 실행될 수 없습니다. I/O에서 차단되거나 동기화 잠금에서 차단될 수 있습니다.

4. 사망 상태: 일반적인 상황에서는 run()이 반환되면 스레드가 종료됩니다. stop() 또는 destroy()를 호출해도 동일한 효과가 있지만 전자는 예외를 생성하고 후자는 강제 종료되어 잠금을 해제하지 않는 것이 좋습니다.

4. 스레드 우선순위

    线程的优先级代表该线程的重要程度,当有多个线程同时处于可执行状态并等待获得 CPU 时间时,线程调度系统根据各个线程的优先级来决定给谁分配 CPU 时间,优先级高的线程有更大的机会获得 CPU 时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。

    你可以调用 Thread 类的方法 getPriority() 和 setPriority()来存取线程的优先级,线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺省是5(NORM_PRIORITY)。

五、线程的同步

    由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。

    我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。

    1. synchronized 方法:通过在方法声明中加入synchronized关键字来声明 synchronized 方法。synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。

    在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized,以控制其对类的静态成员变量的访问。

    synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法run()声明为synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何synchronized方法的调用都永远不会成功。

    2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:

synchronized(syncObject) {
//允许访问控制的代码
}

    synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject 的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

相关学习推荐:编程视频

위 내용은 자바 멀티스레딩이 무슨 뜻인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.