Java 스레드 풀 일반 방법
Executors 이 패키지에 정의된 Executor, Executor 서비스, ScheduledExecutor 서비스, ThreadFactory,Callable 클래스의 공장과 실용적인 방법입니다.
Executor Service는 관리 종료 방법과 비동기 작업의 실행 상황을 추적하기 위해 Future를 생성할 수 있는 방법을 제공합니다.Executor Service를 닫으면 새 작업 수락이 중단됩니다.종료하면 실행 프로그램이 마지막으로 종료됩니다. 실행 중인 작업도, 실행을 기다리는 작업도, 새 작업을 제출할 수 없습니다.
executorService.execute(new TestRunnable());
1. ExecutorService 만들기
도구클래스java를 통해util.concurrent.Executors의 정적 방법으로 생성됩니다.
Executors 이 패키지에 정의된 Executor, Executor 서비스, ScheduledExecutor 서비스, ThreadFactory,Callable 클래스의 공장과 실용적인 방법입니다.
예를 들어, Executor Service의 인스턴스를 만들면 Executor Service는 실제로 스레드 풀의 관리 도구입니다.
ExecutorService executorService = Executors.newCachedThreadPool();
ExecutorService executorService = Executors.newFixedThreadPool(3);
ExecutorService executorService = Executors.newSingleThreadExecutor();
2. 임무를 라인에 추가하여 수행한다
하나의 작업을 스레드 탱크에 추가할 때, 스레드 탱크는 모든 작업에 스레드를 만들고, 이 스레드는 다음 시간에 자동으로 실행됩니다.
3. 실행 서비스 대상을 닫는다
executorService.shutdown();
package javaBasic;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 *  Callable 
 * 
 * @author markGao
 * 
 */
public class ExecutorServiceSample {
    public static void main(String[] args) {
        int numberOfThreads = java.lang.Runtime.getRuntime()
                .availableProcessors();
        ExecutorService pool = Executors.newFixedThreadPool(numberOfThreads);
        for (int i = 0; i < numberOfThreads; i++) {
            pool.execute(new TestRunnable());
            System.out.println("************* execute Processors" + i
                    + " *************");
        }
        pool.shutdown();
    }
}
/**
 * Runnable 
 * 
 * @author markGao
 * 
 */
class TestRunnable implements Runnable {
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 。");
        while (true) {
            try {
                Thread.sleep(5000);
                System.out.println(Thread.currentThread().getName());
                
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}5. 작업 수행의 반환값 얻기
자바5 이후 임무는 두 가지로 나뉜다. 하나는 Runnable 인터페이스를 실현한 클래스이고, 하나는 Callable 인터페이스를 실현한 클래스이다.둘 다 Executor Service에서 실행할 수 있지만, Runnable 작업은 값을 되돌려주지 않고,Callable 작업은 값을 되돌려줍니다.또한Callable의call() 방법은ExecutorService의submit(Callable
public interface Callable
Callable 인터페이스는 Runnable와 유사하며, 둘 다 다른 라인에서 실행될 수 있는 클래스를 위한 것입니다.그러나 Runnable은 결과를 되돌려주지 않고 검사를 거친 이상을 던질 수 없습니다.
Executors 클래스에는 다른 일반적인 형식에서Callable 클래스로 전환하는 실용적인 방법이 포함되어 있습니다.
Callable의 콜 () 방법은 Runnable의run () 방법과 유사합니다. 전자는 되돌아오는 값이 있고 후자는 없습니다.
Callable의 대상을 Executor 서비스의submit 방법에 전달하면, 이 call 방법은 자동으로 하나의 라인에서 실행되고, 실행 결과인Future 대상을 되돌려줍니다.
마찬가지로 Runnable의 대상을 Executor 서비스의submit 방법에 전달하면 이run 방법은 자동으로 한 라인에서 실행되고 실행 결과인Future 대상을 되돌려줍니다. 그러나Future 대상에서 get 방법을 호출하면null로 되돌려줍니다.
package javaBasic;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class CallableDemo {
    public static void main(String[] args) {
        // get available Processors
        int numberOfThreads = java.lang.Runtime.getRuntime()
                .availableProcessors();
        ExecutorService executorService = Executors
                .newFixedThreadPool(numberOfThreads);
        List<Future<String>> resultList = new ArrayList<Future<String>>();
        // create ten tasks
        for (int i = 0; i < 10; i++) {
            // use ExecutorService to execute taks of Callable Type, and save
            // result into future.
            Future<String> future = executorService
                    .submit(new TaskWithResult(i));
            // task result save into List
            resultList.add(future);
        }
        // Traversal Task
        for (Future<String> fs : resultList) {
            try {
                // print every thread result
                System.out.println(fs.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } finally {
                executorService.shutdown();
            }
        }
    }
}
class TaskWithResult implements Callable<String> {
    private int id;
    public TaskWithResult(int id) {
        this.id = id;
    }
    public String call() throws Exception {
        System.out.println(System.currentTimeMillis()
                + " Start call() invoked " + id + " "
                + Thread.currentThread().getName());
        // for (int i = 9999999; i > 0; i--)
        // ;
        Thread.sleep(5000);
        return System.currentTimeMillis() + " End call() invoked " + id
                + "    " + Thread.currentThread().getName();
    }
}스레드 탱크는 두 가지 다른 문제를 해결할 수 있다. 모든 임무의 호출 비용을 줄이기 때문에, 그들은 대량의 비동기 임무를 수행할 때 강화된 성능을 제공할 수 있고, 자원을 귀속하고 관리할 수 있으며 (집합 임무를 수행할 때 사용하는 스레드 포함) 하는 방법도 제공할 수 있다.모든 ThreadPoolExecutor는 완성된 작업 수와 같은 기본적인 통계 데이터를 유지하고 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.