>  기사  >  Java  >  Java에서 스레드가 자신이 지정한 순서대로 실행되도록 하는 방법

Java에서 스레드가 자신이 지정한 순서대로 실행되도록 하는 방법

王林
王林앞으로
2023-05-04 18:10:071406검색

스레드가 지정된 순서대로 실행되도록 하는 방법

일일적인 멀티스레드 개발에서 때로는 CPU가 임의로 예약하는 대신 각 스레드가 우리가 지정한 순서대로 실행되도록 할 수 있습니다. 일상적인 개발 작업에 불필요한 문제가 발생합니다.

이제 이 요구 사항이 있으므로 스레드가 스스로 지정한 순서대로 실행되도록 이 문서의 제목을 소개합니다.

관심 있는 학생들은 다음 코드를 실행하여 가능한 결과를 추측할 수 있습니다.

Java에서 스레드가 자신이 지정한 순서대로 실행되도록 하는 방법

일반적인 이해에 따르면 위 코드의 실행 순서는 t1 → 이상적인 상태는 아닙니다.

아래 그림은 달리기 효과를 보여줍니다.

Java에서 스레드가 자신이 지정한 순서대로 실행되도록 하는 방법

알아보기 Join

Join이 어떤 학생들에게는 낯설지 않을 수도 있지만 여기서는 Join이 무엇인지 자세히 소개하지 않겠습니다. Google.

여기서 우리가 원하는 효과를 얻기 위해 Join을 사용하는 방법을 직접 소개하겠습니다!

Java에서 스레드가 자신이 지정한 순서대로 실행되도록 하는 방법

여기에서는 목적을 달성하기 위해 Join의 차단 효과를 주로 사용합니다. 위 그림의 실행 결과를 보면, 우리가 지정한 순서대로 프로그램이 실행되어 원하는 결과를 얻었음을 알 수 있습니다.

사실 왜 Join이 우리가 원하는 효과를 얻을 수 있는지 깊이 생각해 볼 수 있지 않을까요? 다음으로 소스 코드를 살펴보겠습니다.

조인 소스 코드를 입력하면 가장 먼저 보이는 것은 0개의 매개 변수를 전달하는 조인 방법입니다. 여기서 계속 입력을 선택합니다.

Java에서 스레드가 자신이 지정한 순서대로 실행되도록 하는 방법

먼저 조인 방식이 스레드로부터 안전하다는 것을 알 수 있습니다. 둘째, 들어오는 매개변수가 0일 때 wait(0) 방식이 적중되는 것을 볼 수 있습니다. 경험이 풍부한 학생들은 그것을 직접 볼 수 있어야 합니다. 이것은 기다리는 것을 의미합니다.

하지만 여기서 대기하는 것은 호출자를 기다리는 것이 아니라 차단된 메인 스레드 t1, t2 및 t3은 하위 스레드 실행이 완료되면 대기가 종료된다는 점에 유의해야 합니다. .

이는 Join이 어떻게 작동하는지 보여주고, Join을 통해 우리가 프로그램에서 원하는 결과를 얻을 수 있다는 것을 증명합니다.

Java에서 스레드가 자신이 지정한 순서대로 실행되도록 하는 방법

프로그램에서 스레드의 순서를 제어하는 ​​데 도움을 주는 것 외에도 다른 방법이 있습니다. 예를 들어 스레드 풀을 사용해 보겠습니다.

Executor 스레드 풀 사용하기

Executors는 JDK의 java.util.concurrent 패키지에 있는 스레드 풀 작업 클래스로 스레드 풀 작업을 편리하게 제공할 수 있습니다.

여기에서는 Executors의 newSingleThreadExecutor() 메서드를 사용하여 단일 스레드 스레드 풀을 만듭니다.

Java에서 스레드가 자신이 지정한 순서대로 실행되도록 하는 방법

위 그림에서 볼 수 있듯이 newSingleThreadExecutor() 메소드를 사용하면 실제로 예상한 결과를 얻을 수 있습니다. 메소드 내부는 FIFO 기반 대기열입니다. 즉, t1, t2를 순차적으로 추가하면 t3이 대기열에 추가되면 실제로는 스레드 t1만 준비 상태가 되고, t1이 완료되면 대기열의 다른 스레드가 대기열에 추가됩니다. 계속 실행될 예정이다.

스레드의 우선순위와 실행 순서

연산자를 배울 때 독자들은 연산자 사이에 우선순위가 있다는 것을 알고 있습니다. 연산자의 우선순위를 이해하는 것은 프로그램 개발에 좋은 영향을 미칩니다. 스레드의 경우에도 마찬가지입니다. 각 스레드에는 우선순위가 있습니다. Java 가상 머신은 스레드의 우선순위에 따라 스레드의 실행 순서를 결정하므로 여러 스레드가 충돌 없이 CPU 리소스를 합리적으로 공유할 수 있습니다.

우선순위 개요

Java 언어에서 스레드의 우선순위 범위는 1~10이고 값은 1~10 사이여야 합니다. 그렇지 않으면 예외가 발생합니다. 우선순위의 기본값은 5입니다. 우선순위가 높은 스레드가 먼저 실행되고, 실행이 완료되면 우선순위가 낮은 스레드가 차례대로 실행됩니다. 우선순위가 같으면 차례로 실행됩니다.

Thread 클래스의 setPriority() 메서드를 사용하여 스레드의 우선순위를 설정할 수 있습니다. 구문은 다음과 같습니다.

public final void setPriority(int newPriority);

현재 스레드의 우선순위를 얻으려면 getPriority() 메소드를 직접 호출할 수 있습니다. 구문은 다음과 같습니다.

public final int getPriority();

우선순위 사용

우선순위를 간략하게 이해한 후 간단한 예를 사용하여 우선순위 사용 방법을 보여드리겠습니다.

예제 1

Thread 클래스와 Runnable 인터페이스를 각각 사용하여 스레드를 생성하고 우선순위를 할당합니다.

public class FirstThreadInput extends Thread
{
    public void run()
    {
        System.out.println("调用FirstThreadInput类的run()重写方法");    //输出字符串
        for(int i=0;i<5;i++)
        {
            System.out.println("FirstThreadInput线程中i="+i);    //输出信息
            try
            {
                Thread.sleep((int) Math.random()*100);    //线程休眠
            }
            catch(Exception e){}
        }
    }
}

(2) Runnable 인터페이스를 구현하고 run() 메서드를 구현하는 SecondThreadInput 클래스를 만듭니다. 코드는 다음과 같습니다:

public class SecondThreadInput implements Runnable
{
    public void run()
    {
        System.out.println("调用SecondThreadInput类的run()重写方法");    //输出字符串
        for(int i=0;i<5;i++)
        {
            System.out.println("SecondThreadInput线程中i="+i);    //输出信息
            try
            {
                Thread.sleep((int) Math.random()*100);    //线程休眠
            }
            catch(Exception e){}
        }
    }
}

(3) 创建 TestThreadInput 测试类,分别使用 Thread 类的子类和 Runnable 接口的对象创建线程,然后调用 setPriority() 方法将这两个线程的优先级设置为 4,最后启动线程。代码如下:

public class TestThreadInput
{
    public static void main(String[] args)
    {
        FirstThreadInput fti=new FirstThreadInput();
        Thread sti=new Thread(new SecondThreadInput());
        fti.setPriority(4);
        sti.setPriority(4);
        fti.start();
        sti.start();
    }
}

(4) 运行上述代码,运行结果如下所示。

调用FirstThreadInput类的run()重写方法
调用SecondThreadInput类的run()重写方法
FirstThreadInput线程中i=0
SecondThreadInput线程中i=0
FirstThreadInput线程中i=1
FirstThreadInput线程中i=2
SecondThreadInput线程中i=1
FirstThreadInput线程中i=3
SecondThreadInput线程中i=2
FirstThreadInput线程中i=4
SecondThreadInput线程中i=3
SecondThreadInput线程中i=4

由于该例子将两个线程的优先级都设置为 4,因此它们交互占用 CPU ,宏观上处于并行运行状态。

重新更改 ThreadInput 类的代码、设置优先级。代码如下:

fti.setPriority(1);
sti.setPriority(10);

重新运行上述代码,如下所示。

调用FirstThreadInput类的run()重写方法
调用SecondThreadInput类的run()重写方法
FirstThreadInput线程中i=0
SecondThreadInput线程中i=0
SecondThreadInput线程中i=1
SecondThreadInput线程中i=2
SecondThreadInput线程中i=3
SecondThreadInput线程中i=4
FirstThreadInput线程中i=1
FirstThreadInput线程中i=2
FirstThreadInput线程中i=3
FirstThreadInput线程中i=4

위 내용은 Java에서 스레드가 자신이 지정한 순서대로 실행되도록 하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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