>  기사  >  Java  >  Java 스레드 동기화 구현 방법에 대한 자세한 설명(코드 포함)

Java 스레드 동기화 구현 방법에 대한 자세한 설명(코드 포함)

不言
不言앞으로
2018-10-19 16:14:172633검색

이 기사는 Java 스레드 동기화 구현 방법(코드 포함)에 대한 자세한 설명을 제공합니다. 이는 특정 참고 가치가 있으므로 도움이 될 수 있습니다.

스레드 동기화가 필요한 이유

파일과 같은 동일한 리소스에서 여러 스레드가 작동하는 경우 여러 스레드가 동시에 파일을 작동하도록 허용할 수 없습니다. 파일을 공유하면 여러 작업이 충돌하기 때문입니다. 팀 개발을 위해 git을 사용해보신 분들은 가격비교에 있어 깊은 경험을 하게 되리라 믿습니다.

이제 스레드 동기화 메커니즘을 도입해야 합니다.

소위 동기화는 하나씩 실행, 즉 여러 스레드가 실행을 위해 대기하므로 스레드 간에 선착순 관계가 있습니다. 이렇게 하면 싸움도 갈등도 없을 것입니다.

문제 설명

두 개의 스레드가 있는 프로그램입니다. 첫 번째 스레드는 2에서 1000 사이의 짝수와 숫자를 계산하고, 두 번째 스레드는 1000에서 2000 사이의 짝수와 숫자를 계산합니다.

초기 구현

먼저 주제에 따라 구현 방법을 설계해 보겠습니다.

1. 두 개의 스레드를 정의합니다. 여기서는 자신만의 스레드 클래스를 정의한 다음 짝수 계산의 시작과 끝을 설정해야 합니다
2. 주어진 범위 내에서 짝수 및 짝수의 계산을 구현합니다
3. 구현이 매우 간단하다는 것을 확인하세요. 예비 구현은 다음과 같습니다.

1. 자신만의 스레드 클래스 정의:

public class MyTread extends Thread {
    private int begin;          // 范围开始
    private int end;            // 范围结束

    public MyTread(int begin, int end) {
        this.begin = begin;
        this.end = end;
    }
}

2. 짝수 및 짝수 계산 구현

@Override
public void run() {
    this.getEven(begin, end);
}

// 获取偶数以及个数
private void getEven(int begin, int end) {
    int count = 0;
    System.out.println(begin + "~" + end + "之间的偶数为:");
    if (begin % 2 != 0) {
        begin += 1;
    }

    for (; begin 

3 스레드를 초기화하고

public static void main(String[] args) {
    MyTread tread1 = new MyTread(2, 500);
    MyTread tread2 = new MyTread(500, 1000);
    tread1.start();
    tread2.start();
}

참고: 나중에 효과를 보여주기 위해 여기에서는 수치 범위를 줄였습니다. 결과를 보세요:

Java 스레드 동기화 구현 방법에 대한 자세한 설명(코드 포함) 우리가 원하는 효과는 아닌 것 같습니다. 우리는 이 효과를 원합니다:

Java 스레드 동기화 구현 방법에 대한 자세한 설명(코드 포함) 우리는 각 부분의 짝수와 짝수가 함께 있기를 원하지만, 구현한 후의 효과는 실제로 두 부분이 혼동된다는 것입니다.

프로그램 개선

위 문제를 해결하려면 처음에 이야기한 스레드 동기화를 사용해야 합니다.

초기 소개에 따르면 동기화를 위한 한 가지 조건은 공유 리소스가 있어야 한다는 것을 알아냈습니다. 그렇다면 우리 코드에서 이 공유 리소스는 무엇인가요? 그렇지 않은 것 같습니다. 먼저 하나를 만드십시오. 线程同步了。

根据我们开始的介绍,发现实现同步的一个条件就是有一个共享的资源。那么我们的代码里什么是这个共享的资源呢?貌似没有。所以先创建一个。

1.建立共享资源

我们这里的共享资源完全就可以是同一个对象,所以我们就另外建立一个类,用来示例共享资源。

public class Even {}

2.然后在共享类中建立计算偶数的方法:

public class Even {
    /**
     * 获取某个范围内偶数以及个数
     * @param begin 统计开始
     * @param end   统计结束
     */
    public synchronized void getEven(int begin, int end) {
        int count = 0;
        System.out.println(begin + "~" + end + "之间的偶数为:");
        if (begin % 2 != 0) {
            begin += 1;
        }

        for (; begin <p>细心的人会发现,这个方法跟我们最开始写的方法有点不同,它多了一个关键字:<code>synchronized</code></p><p>1. 공유 리소스 만들기<strong></strong></p>여기의 공유 리소스는 완전히 <code>동일한 개체</code>일 수 있으므로 공유 리소스 예시를 위해 다른 클래스를 만듭니다. <p></p><pre class="brush:php;toolbar:false">public class MyTread extends Thread {
    Even even;
    
    @Override
    public void run() {
        even.getEven(begin, end);
    }
}

2. 그런 다음 공유 클래스에서 짝수를 계산하는 메서드를 만듭니다. Java 스레드 동기화 구현 방법에 대한 자세한 설명(코드 포함)

/**
 * 偶数类
 */
public class Even {
    /**
     * 获取某个范围内偶数以及个数
     * @param begin 统计开始
     * @param end   统计结束
     */
    public synchronized void getEven(int begin, int end) {
        int count = 0;
        System.out.println(begin + "~" + end + "之间的偶数为:");
        if (begin % 2 != 0) {
            begin += 1;
        }

        for (; begin 
주의 깊은 사람들은 이 메서드가 원래 작성한 메서드와 약간 다르다는 것을 알게 될 것입니다: . 동기화 . 이 키워드를 통해 메소드 실행 시 스레드 동기화를 달성할 수 있습니다.

3. 마지막으로 스레드에서 공유 메소드를 호출합니다.

rrreee

이제 다시 실행해 보겠습니다.

🎜🎜🎜🎜🎜원하는 효과를 얻으세요. 🎜🎜마지막으로 전체 코드가 첨부됩니다: 🎜rrreee🎜🎜🎜

위 내용은 Java 스레드 동기화 구현 방법에 대한 자세한 설명(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제