>  기사  >  Java  >  Java 동시 프로그래밍 스레드 생성 방법:

Java 동시 프로그래밍 스레드 생성 방법:

WBOY
WBOY앞으로
2023-05-09 13:01:071328검색

1. 스레드 및 프로세스

프로세스는 데이터 수집에서 실행되는 코드 활동입니다. 이는 시스템에 의한 리소스 할당 및 예약의 기본 단위입니다. 프로세스에는 하나 이상의 스레드가 있습니다. , 이는 CPU 스케줄링 및 할당입니다. 프로세스의 기본 단위는 프로세스의 여러 스레드가 프로세스의 리소스를 공유하는 것입니다.

프로세스의 세 가지 특징:

  • 역학: 프로세스는 메모리, CPU, 네트워크 등의 자원을 동적으로 점유하는 실행 프로그램입니다.

  • 독립성: 프로세스는 서로 독립적이며 자체 메모리 영역을 갖습니다.

  • 동시성: CPU가 단일 코어인 경우 실제로는 메모리에서 동시에 하나의 프로세스만 실행됩니다. CPU는 각 프로세스를 차례로 제공하기 위해 시간 공유 방식으로 폴링하고 전환합니다. 전환 속도가 매우 빠르기 때문에 이러한 프로세스가 동시에 실행되고 있다는 느낌을 줍니다.

2. 스레드 생성 및 실행

프로세스에서 스레드를 생성하는 세 가지 방법이 있습니다.

  • 방법 1: 스레드 클래스 상속

  • 1. 스레드 클래스.

  • 2. run() 메서드를 재정의합니다.

  • 3.

  • 4. 스레드 개체의 start() 메서드를 호출하여 스레드를 시작합니다.

public class ThreadDemo {
    // 启动后的ThreadDemo当成一个进程。
    // main方法是由主线程执行的,理解成main方法就是一个主线程
    public static void main(String[] args) {
        // 3.创建一个线程对象
        Thread t = new MyThread();
        // 4.调用线程对象的start()方法启动线程,最终还是执行run()方法!
        t.start();

        for(int i = 0 ; i < 100 ; i++ ){
            System.out.println("main线程输出:"+i);
        }
    }
}

// 1.定义一个线程类继承Thread类。
class MyThread extends Thread{
    // 2.重写run()方法
    @Override
    public void run() {
        // 线程的执行方法。
        for(int i = 0 ; i < 100 ; i++ ){
            System.out.println("子线程输出:"+i);
        }
    }
}

이점: 코딩은 간단합니다. Thread.currentThread() 메서드를 사용하지 않고 run() 메서드에서 현재 스레드를 직접 가져오려면 이를 직접 사용하면 됩니다. 단점: 스레드 클래스는 Thread 클래스를 상속받았으며 다른 클래스를 상속할 수 없으며, 상속을 통해 기능을 확장할 수 없습니다(단일 상속의 한계). 또한, 작업과 코드가 분리되지 않습니다. 여러 스레드가 동일한 작업을 수행하는 경우 여러 작업 코드가 필요합니다.

요약:

  • 스레드 클래스는 Thread를 상속하는 클래스입니다.

  • 스레드를 시작하려면 start() 메서드를 호출해야 합니다.

  • 멀티스레딩은 CPU 실행을 동시에 선점하는 것이므로 실행 프로세스 중에 동시성 무작위성이 발생합니다.

방법 2: Runnable 인터페이스를 구현하는 방법.

  • 1. Runnable 인터페이스를 구현하기 위한 스레드 작업 클래스를 만듭니다.

  • 2. run() 메서드를 재정의합니다.

  • 3.

  • 4. 스레드 작업 개체를 스레드 개체로 압축합니다.

  • 5. 스레드 개체의 start() 메서드를 호출하여 스레드를 시작합니다.

public class ThreadDemo {
    public static void main(String[] args) {
        // 3.创建一个线程任务对象(注意:线程任务对象不是线程对象,只是执行线程的任务的)
        Runnable target = new MyRunnable();
        // 4.把线程任务对象包装成线程对象.且可以指定线程名称
        // Thread t = new Thread(target);
        Thread t = new Thread(target,"1号线程");
        // 5.调用线程对象的start()方法启动线程
        t.start();

        Thread t2 = new Thread(target);
        // 调用线程对象的start()方法启动线程
        t2.start();

        for(int i = 0 ; i < 10 ; i++ ){
            System.out.println(Thread.currentThread().getName()+"==>"+i);
        }
    }
}

// 1.创建一个线程任务类实现Runnable接口。
class MyRunnable implements Runnable{
    // 2.重写run()方法
    @Override
    public void run() {
        for(int i = 0 ; i < 10 ; i++ ){
            System.out.println(Thread.currentThread().getName()+"==>"+i);
        }
    }
}

이점:

스레드 작업 클래스는 Runnable 인터페이스만 구현하고 다른 클래스를 계속 상속할 수 있으며 다른 인터페이스를 계속 구현할 수 있습니다(단일 상속의 제한을 피함). 동일한 스레드 작업 개체는 여러 스레드 개체로 패키징될 수 있으며, 이는 여러 스레드가 동일한 리소스를 공유하는 데 적합합니다. 디커플링 작업을 달성하기 위해 스레드 작업 코드는 여러 스레드에서 공유될 수 있으며 스레드 작업 코드와 스레드는 독립적입니다.

방법 3: Callable 인터페이스 구현

  • 1. Callable 인터페이스를 구현하기 위한 스레드 작업 클래스를 정의하고 스레드 실행 결과 유형을 선언합니다.

  • 2. 스레드 작업 클래스의 호출 메서드를 다시 작성합니다. 이 메서드는 실행 결과를 직접 반환할 수 있습니다.

  • 3. 호출 가능 스레드 작업 개체를 만듭니다.

  • 4. Callable 스레드 작업 개체를 FutureTask 개체로 압축합니다.

  • 5. FutureTask 개체를 스레드 개체로 압축합니다.

  • 6. 스레드의 start() 메서드를 호출하여 스레드를 시작합니다.

public class ThreadDemo {
    public static void main(String[] args) {
        // 3.创建一个Callable的线程任务对象
        Callable call = new MyCallable();
        // 4.把Callable任务对象包装成一个未来任务对象
        //      -- public FutureTask(Callable<V> callable)
        // 未来任务对象是啥,有啥用?
        //      -- 未来任务对象其实就是一个Runnable对象:这样就可以被包装成线程对象!
        //      -- 未来任务对象可以在线程执行完毕之后去得到线程执行的结果。
        FutureTask<String> task = new FutureTask<>(call);
        // 5.把未来任务对象包装成线程对象
        Thread t = new Thread(task);
        // 6.启动线程对象
        t.start();

        for(int i = 1 ; i <= 10 ; i++ ){
            System.out.println(Thread.currentThread().getName()+" => " + i);
        }

        // 在最后去获取线程执行的结果,如果线程没有结果,让出CPU等线程执行完再来取结果
        try {
            String rs = task.get(); // 获取call方法返回的结果(正常/异常结果)
            System.out.println(rs);
        }  catch (Exception e) {
            e.printStackTrace();
        }

    }
}

// 1.创建一个线程任务类实现Callable接口,申明线程返回的结果类型
class MyCallable implements Callable<String>{
    // 2.重写线程任务类的call方法!
    @Override
    public String call() throws Exception {
        // 需求:计算1-10的和返回
        int sum = 0 ;
        for(int i = 1 ; i <= 10 ; i++ ){
            System.out.println(Thread.currentThread().getName()+" => " + i);
            sum+=i;
        }
        return Thread.currentThread().getName()+"执行的结果是:"+sum;
    }
}

이점: 스레드 작업 클래스는 Callable 인터페이스만 구현하며 계속해서 다른 클래스를 상속하고 다른 인터페이스를 구현할 수 있습니다(단일 상속의 제한을 피함). 동일한 스레드 작업 개체는 여러 스레드 개체로 패키징될 수 있으며, 이는 여러 스레드가 동일한 리소스를 공유하는 데 적합합니다. 디커플링 작업을 달성하기 위해 스레드 작업 코드는 여러 스레드에서 공유될 수 있으며 스레드 작업 코드와 스레드는 독립적입니다. 가장 중요한 것은 스레드 실행 결과를 직접 얻을 수 있다는 것입니다.

위 내용은 Java 동시 프로그래밍 스레드 생성 방법:의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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