>Java >java지도 시간 >Java 로컬 스레드(ThreadLocal)

Java 로컬 스레드(ThreadLocal)

黄舟
黄舟원래의
2017-02-28 10:52:492223검색

Java의 ThreadLocal 클래스는 생성한 변수가 동일한 스레드에서만 읽고 쓸 수 있도록 보장합니다. 따라서 두 스레드가 동일한 코드를 실행하고 해당 코드에 ThreadLocal 변수에 대한 참조가 있더라도 두 스레드는 서로의 ThreadLocal 변수를 볼 수 없습니다.

ThreadLocal 생성

다음은 ThreadLocal을 생성하는 방법을 보여주는 코드입니다.

private ThreadLocal myThreadLocal = new ThreadLocal();


As you 예, 새 ThreadLocal 개체를 인스턴스화합니다. 이 작업은 스레드당 한 번만 수행하면 됩니다. 서로 다른 스레드가 ThreadLocal에 액세스하는 동일한 코드를 실행하더라도 각 스레드는 자체 ThreadLocal 인스턴스만 볼 수 있습니다. 두 스레드가 동일한 ThreadLocal 객체에 서로 다른 값을 설정하더라도 서로의 값을 볼 수는 없습니다.

ThreadLocal 액세스

ThreadLocal이 생성되면 다음과 같이 저장할 값을 설정할 수 있습니다.

myThreadLocal.set("A thread local value");

다음과 같이 값을 읽을 수 있습니다.

String threadLocalValue = (String) myThreadLocal.get();

get 메소드는 객체를 반환하고 set 메소드는 객체를 매개변수로 전달합니다.

일반 ThreadLocal

get 메소드 강제 변환 호출 시 별도의 작업을 수행하지 않아도 되도록 일반 ThreadLocal을 생성할 수 있습니다. 예는 다음과 같습니다.

private ThreadLocal<String> myThreadLocal = new ThreadLocal<String>();

이제 ThreadLocal 인스턴스에만 문자열 유형을 저장할 수 있습니다. 또한 이 값을 강제로 변환할 필요는 없습니다:

myThreadLocal.set("Hello ThreadLocal");

String threadLocalValue = myThreadLocal.get();


ThreadLocal 값 초기화

ThreadLocal 객체 이 값을 설정하는 스레드에만 표시되므로 어떤 스레드도 set 메소드를 사용하여 모든 스레드에 표시되도록 ThreadLocal 값을 설정할 수 없습니다.

대신 ThreadLocal을 서브클래싱하고initialValue 메서드를 재정의하여 ThreadLocal 객체의 초기 값을 지정할 수 있습니다.


private ThreadLocal myThreadLocal = new ThreadLocal<String>() {
    @Override protected String initialValue() {
        return "This is the initial value";
    }
};


이제 모든 스레드는 set 메소드를 호출하기 전에 동일한 초기화 값을 볼 수 있습니다.

전체 ThreadLocal 인스턴스

다음은 완전히 실행 중인 ThreadLocal 인스턴스입니다

public class ThreadLocalExample {


    public static class MyRunnable implements Runnable {

        private ThreadLocal<Integer> threadLocal =
               new ThreadLocal<Integer>();

        @Override
        public void run() {
            threadLocal.set( (int) (Math.random() * 100D) );
    
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
            }
    
            System.out.println(threadLocal.get());
        }
    }


    public static void main(String[] args) {
        MyRunnable sharedRunnableInstance = new MyRunnable();

        Thread thread1 = new Thread(sharedRunnableInstance);
        Thread thread2 = new Thread(sharedRunnableInstance);

        thread1.start();
        thread2.start();

        thread1.join(); //wait for thread 1 to terminate
        thread2.join(); //wait for thread 2 to terminate
    }

}

이 예는 별도의 MyRunnable 인스턴스를 생성합니다. 두 개의 다른 스레드로 전달됩니다. 두 스레드 모두 run 메소드를 실행하고 ThreadLocal 인스턴스에 서로 다른 값을 설정했습니다. 이 set 메서드에 대한 호출이 동기적이고 ThreadLocal 개체를 사용하지 않는 경우 두 번째 스레드는 첫 번째 스레드에서 설정한 값을 덮어씁니다.

단, ThreadLocal 객체이기 때문에 서로의 값을 볼 수는 없습니다. 따라서 서로 다른 값을 설정하고 얻습니다.

InheritableThreadLocal

이 InheritableThreadLocal 클래스는 ThreadLocal 클래스의 하위 클래스입니다. ThreadLoca 내에서 각 스레드가 자체 값을 갖는 대신 이 클래스를 사용하면 하나의 스레드와 해당 스레드에 의해 생성된 모든 하위 스레드의 값에 액세스할 수 있습니다.

위 내용은 Java 로컬 스레드(ThreadLocal) 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


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