JAVA 프로그래밍 ---- 동시 스레드별로, 스레드 간의 공유 및 작동

첫째, 기본 개념  

1. 프로세스 및 스레드 무엇입니까

프로세스는 자원 할당의 최소 단위 운영 체제이며, 그 다음 프로세스는 다수의 스레드를 가질 수있다

스레드가 CPU 스케쥴링의 최소 단위 인 프로세스의 독립적으로 존재할 수없는, 프로세스 리소스를 공유 할 수있다

스레드 및 코어의 관계 2.CPU 번호

일반적으로 코어 --cpu 번호 = 1 스레드의 수 : 1

이후 인텔 기준 하이퍼 = 1 : 2

3.CPU 시간 회전기구

동시 프로그래밍 CPU 시간 슬라이스 회전 메커니즘 (RR 스케줄링) _Java_ 탄 칭하이 -CSDN 블로그

4. 병렬 및 동시

병렬 : 작업의 수를 실행하는 동안

예를 들면 : 사람들에게 서비스를 제공 할 수있는 커피 머신은 다음 두 가지 경우, 다음 병렬 2의 수는, 병렬의 숫자입니다

동시성 : 작업 번호를 수행 할 수있는 기간

예를 들면 : 커피 두 잔을 생산할 수있는 10 분 커피 머신은, 우리는 2의 10 분 이내에 동시 동시의 수를 고려할 수 있습니다

생각 : JAVA 이유 동시 프로그래밍의 소개

1. CPU 자원을 최대한 활용;

사용자 응답 시간을 단축합니다;

둘째, 자바 스레드에 대한 이해

스레드에서 JAVA는 협력을 선점하지 않습니다

프로그램의 1.java은 본질적으로 다중 스레드, 다음 몇 가지 방법이 있습니다 새 스레드를 시작?

우리가 그것을 증명 때문에 자바는 본질적으로 멀티 스레드 왜

공공 정적 무효 메인 (문자열 []에 args) {

// 자바 가상 머신 스레드 시스템 관리 인터페이스

    ThreadMXBeanthreadMXBean ManagementFactory.getThreadMXBean = ();

// 단지 스레드와 스레드 스택 정보를 얻을 수

    ThreadInfo에 [] = threadInfos threadMXBean.dumpAllThreads (거짓, 거짓);

{: (threadInfos ThreadInfo에 ThreadInfo에)에 대한

에서 System.out.println ( "["+ threadInfo.getThreadId () + "]"+ threadInfo.getThreadName ());

}

}

우리는 콘솔에 발견 할 것이다 실행 우리의 스레드에 많은 정보를 인쇄 한 후 (스레드 정보가 정보 만이 아닌 점)

[8] JDWP 명령 리더

[7] JDWP 이벤트 헬퍼 스레드

[6] JDWP 전송 수신기 : dt_socket

[5] 리스너 --- 덤프 스레드 정보 스레드를 첨부

[4] 신호 디스패처

[3] 파이널 --- 재활용 대상 스레드 (스레드 데몬)

[2] 참조 처리기 --- 기준 회수 처리 스레드

[1] 본체 --- 메인 쓰레드 메인

우리 JAVA 설명하기 위해 우리를 위해 스레드를 많이 인쇄하는 하나의 주요 방법은 멀티 스레드 협력 본질적이다

스레드를 시작하는 여러 가지 새로운 방법

JDK 스레드 노트는 소스 코드를 제공

JDK는 두 가지 방법이 있습니다 우리에게 알려줍니다  

(1) 실을 확장   

(2) 구현의 Runnable

(3). 구현 호출 가능 참고 호출 가능 값이 반환되고,의 Runnable로 간주 될 수도

다음은 달성 할 수있는 코드

공용 클래스 Theadextends 스레드 {

@우세하다

    공공 무효 실행 () {

( "스레드에서 상속")에서 System.out.println;

}

}

공용 클래스 Thead1implements의 Runnable {

@우세하다

    공공 무효 실행 () {

에서 System.out.println ( "实现 Runnable를");

}

}

공용 클래스 Thead2implements 호출 가능 {

@우세하다

    공공 개체 ()를 호출하면 예외 {던졌습니다

"호출 가능을 달성하기"를 반환;

}

}

우리는 스레드와의 Runnable 어떤 차이를 만드는가라고 그래서?

1.Thead 스레드의 추상화이며, Runable은 추상 작업입니다

2. 자원 공유를위한 클래스 상속 스레드, 적합하지 않은 경우. 그러나 Runable 구현 인터페이스 있다면, 쉽게 자원을 공유 할 수 있습니다.

3.main 스레드 객체의 인스턴스는 다른

나사 연장 : t.start를 ();

구현의 Runnable : 새로운 스레드 (t) .start ();

4. 실행 가능한 프로세스의 견고성을 향상 코드는 다중 스레드, 별도의 코드와 데이터를 공유 할 수 있습니다

스레드 풀은뿐만 아니라 직접 클래스 상속 스레드로, 스레드 또는 호출 클래스로 Runable을 달성 할 수있다

2. 아주, JAVA, 어떻게 스레드 안전 정지를 만들기 위해 끝을 시작?

정지 () 또는 () 인터럽트, isInterrupted ()는 정적 방법은 => 우리는 이러한 방법을 이해할 필요) (중단

정지 () --- 현재 스레드를 강제로 중지

우리는 긍정적 인 조치를 제공하기 때문에 사용하지 않는 것이 좋습니다 소스 코드 스레드 정지 방법은 JDK가 우리에게 보여줍니다 오래된 라벨, 표시되어 볼 수 있고, 안전 및 자원 회수 스레드를 보장 할 수 없습니다

인터럽트 () --- 스레드 알림 인터럽트 (사실, 플래그 인터럽트 스레드를 설정)

자신의 스레드를 중단할지 여부를 결정할 아닌 강제 휴식을위한, 당신에게 정지 현재의 thread에게 인사를 우리의 스레드하는 것입니다 우리는 생각할 수

isInterrupted () --- 현재의 thread가 중단 여부를 결정 

그것은 일반적으로 스레드 실행 방법 여부 작업을 결정하기 위해 사용된다

인터럽트 플래그 () 중단 --- 스레드

또한 스레드가 중단되었는지 여부를 확인하는 데 사용할 수 있지만, true에서 false로 플래그를 중단됩니다

* 요구 현재 스레드를 얻기 위해, 실행 가능한에서 사용는 Thread.currentThread () 메소드를 수행하기 위해,의 Runnable은 상기 방법에 제공되지

차단 방법은 예외 : InterruptedException를 throw하는 경우 * 스레드는 우리가 캐치에서 수동으로 재 호출 인터럽트 () 메소드에 필요 중단되지 않습니다

* 교착 상태에있는 스레드가 중단 귀찮게하지 않습니다

셋째, 자바에서 더 많은 이해를 조금 스레드

라이프 사이클의 스레드

스레드 및 스레드 일반적인 방법 1. 상태

심층 실행 (이해)와 시작 ()

죽음의 실행 후, 비즈니스 메소드를 실행 스레드 () 메소드를 실행

CPU 시간은 실행 상태를 입력 할 수 있습니다 할당 할 때 시작 () 준비 상태 (실행 상태)로 스레드, 각 스레드는 대기 시간 조각 회전, 한 번만 호출 할 수 있습니다

역할 대기 ()는 같은 시간, 대기 ()는 현재 스레드를 해제 해, 보관 유지되고있는 잠금 장치를 만들고, 대기 상태로 현재의 thread를 허용하는 것입니다. (이하 "준비 상태"로), 현재의 thread가 깨어 나면 "다른 스레드가 호출 할 때 객체의 () 메소드 또는가는 notifyAll () 메소드를 통지"

역할 통지 ()과의 notifyAll ()가, 그것은 현재의 주제에 스레드를 기다리는 웨이크이며, 하나의 스레드를 자각하는 것입니다) (통지의 notifyAll () 웨이크 업 모든 스레드입니다

대기 (긴 타임 아웃) 때문에에 현재 스레드 "기다리는 상태 (차단)"는 "객체의 알릴 다른 스레드 호출 할 때 () 법의 notifyAll ()에있어서, 지정된 시간 '과 현재 스레드"(입력 깨어나서 준비 상태 ")

Thread.yield Java 스레드 () 메소드, 번역 스레드 양보. 이름에서 알 수 후, 스레드가이 방법을 사용하는 경우, 그것은 밖으로 빠져 나가게하는 CPU의 실행 시간을 자신의 것, 자신이나 다른 스레드가 실행하자, 자신에주의를 기울이다 또는 다른 스레드는 단순히 다른 스레드를 제공하기 위해, 실행 .

수율의 역할은 () 양보입니다. 나중에, 그러나, 현재의 thread가 수율 (), 같은 우선 순위가 다른 호출을 보장하지 않습니다 너무 행정권에 우선 순위가 동일한 액세스 권한이있는 다른 대기 스레드가 있는지, 현재의 thread에 "준비 상태"로 "상태를 실행"을 할 수 있습니다 현재의 thread가 "동작 상태"을 체결했다고 계속 실행 가능, 스레드 바로 구현을 얻을 수있을 것입니다

수율의 역할은 ()는 잠금을하지 않습니다, CPU에서 할 수있다

() 메소드에 가입하면, 실행은 오른쪽 스레드가 직렬 병렬 변화로부터 순차적으로 실행될 수 있도록, 취득한

setPriority를 ​​() 메소드는, 우선 순위 설정은, 자바 우선 순위 레벨은 1-10로 분할되고, 기본적으로는 5 아니지만 보장 우선 순위 스레드 실행 순서 순서는 실제 CPU에 의해 판정 할  

데몬 스레드 주 스레드의 멸망에 스레드, 같은 GC 쓰레드로 메인 스레드를 제공, 새로운 스레드는 사용자 스레드 (비 데몬 스레드)입니다

setDaemon를 (부울)에 데몬 스레드를 설정, 기본은 거짓, 진실 데몬 스레드

* 참고 : 가디언 스레드가 마지막으로 반드시 타임 슬라이스를 구현하기 위해 할당 UPU, 그것은 전적으로 운영 체제 스케줄러에 의해 결정 실행되지 것 역할을하지 않습니다

넷째, 스레드 사이에 공유

1.synchronized 키워드 (내장 잠금)

종료 될 때까지 단계가 설립 된 코드의 단계에 따라 수행으로 스크립트처럼, 자신의 스택 공간이 실행 ​​스레드. 그러나 각 실행 스레드, 아주 작은, 다중 스레드 사물과 협력 계약 사이의 데이터의 공유를 포함하여 작업을 완료하기 위해 서로 협력 할 수있는 경우 분리 만, 다음 더 작은 값 또는 가치를 실행합니다. 이 엄청난 가치를 제공 할 것입니다. 자바 지원하는 다중 스레드 객체 또는 객체의 멤버 변수 액세스 키워드 방법 동기화 수정할 수 또는 사용에 싱크 블록의 형태로, 그 방법으로 동시에 오직 하나 개의 스레드가 그 복수의 스레드를 위해 주로 또는 동기 블록은, 또한 알려진 공개 변수 액세스 전용 스레드를 보장 내장 고정기구.

객체 클래스 및 잠금 잠금 객체 인스턴스 오브젝트를 잠금 또는 개체의 경우에, 객체 클래스 잠금 클래스에 정적 방법 또는 클래스의 클래스이다. 우리는 객체 인스턴스의 클래스가 많은이 될 수 있다는 것을 알고 있지만, 각 클래스는 하나의 클래스 객체를 다른 객체 인스턴스가 서로 간섭 객체 잠금을 가지고 있지만 각 클래스는 하나의 클래스 잠금 장치가 있습니다. 그러나 한 가지 사실, 잠금 자물쇠 같은 사실은 사실이 아니다 개념에 대한 잠금과 같은 뭔가가, 각 클래스의 객체의 해당 클래스가된다 있다는 점에주의해야합니다. 자물쇠와 객체 사이의 잠금이 비 간섭하는

유용성 및 사용

(1) 방법 로크 (동기화 방법), 동기 블록

공공 동기화 무효 incCount2 () {카운트 ++;}

공공 무효 incCount3 () { 

 동기 (이) { 

 ++ 계산; 

 }

}

(2) 오브젝트 록킹

개인 Objectobj 새로운 개체 () =; // 잠금로

공공 무효 incCount () { 

 동기 (OBJ) { 

 ++ 계산; 

 }

}

로크 (3)

공공 동기화 정적 무효 incCount4 () {카운트 ++;}

* 참고 : 동기화 잠금 객체는 객체의 잠금이 변경 될 수 없음을 확인해야합니다

가벼운 2.volatile 동기화 메커니즘

휘발성 가변의 나사 수정 값이 가변 인 동작, 상이한 스레드가 다른 스레드에 대한 새로운 값을 즉시 볼 때 시인성을 확보

휘발성 스레드가 동시에 여러 스레드에 기록 된 데이터의 안전을 보장 할 수 없습니다

가장 휘발성 적용 시나리오 : 스레드 쓰기, 다중 스레드를 읽고

3.ThreadLocal 분석

Synchonized과 비교 (1)

ThreadLocal를 Synchonized 및 멀티 스레드의 동시 액세스를 해결하기 위해 사용된다. 그러나의 ThreadLocal과는 차이의 본질을 동기화. 로크기구 한번에 가변 코드 블록, 또는 오직 하나의 스레드가 액세스 할 수 이용한 동기화. 방문 할시에 각 스레드에 따라서 데이터의 다수의 스레드에 의해 공유 된 데이터를 분리하는 동일한 개체되지 않도록 각 스레드있어 ThreadLocal 변수의 복사본을 제공한다

Spring의 트랜잭션이의 ThreadLocal 클래스를 도움이 될 것입니다. 봄은 데이터베이스 연결 풀에서 연결을 얻을, 다음의 ThreadLocal 연결에 넣어가됩니다 쓰레드 범위

한 연결로의 ThreadLocal에서 운영 얻을. 왜 봄 트랜잭션의 ThreadLocal 클래스에 의존해야? JDBC, 예를 들어, 일반적인 트랜잭션 코드처럼 보일 수 있습니다 :

 DBC = newDataBaseConnection (); // 1 호선 

Connectioncon dbc.getConnection = (); // 라인 (2)

 con.setAutoCommit (거짓) //// 3 호선 

con.executeUpdate (...); // 라인 (4) 

con.executeUpdate (...); // 라인 (5) 

con.executeUpdate (...); // 6 행 

con.commit (); //// 행 7 

3 사업 처리 단계에 라인 1 : 트랜잭션의 준비 단계 : 코드는 세 부분으로 나눌 수 있습니다 첫 번째 4-6 행 트랜잭션 단계 커밋 : 7 호선이 명확하게 볼 수 있습니다, 우리는 거래 또는 특정의 SQL의 구현을 열 수 있는지 여부 우리는 특정 데이터베이스 연결이 필요합니다. 우리는 DAO (DataAccessObject) 개체 아래 코드의 문제를 제어하면 지금 우리가 개발 한 응용 프로그램은 일반적으로 그들과 거래를 종료를 열고 모든 방법의 DAO 개체, 3 계층 구조를 사용하면 통화 DAO의 서비스 개체, 단지 DAO 호출하면, 그래서 우리는 좋은 결과를 얻을 수 있다고하지만, 종종 우리의 서비스, 다음이 시간이 우리가 경계의 업무를 통제 할 수없는 데이터베이스에 DAO를 여러 일련의 조작을 호출 실제 응용 프로그램 때문에, DAO의 수는 우리의 서비스가 불확실 전화, 수요에 따라 달라질 수 있습니다뿐만 아니라, 상황은 서비스 호출 서비스를 발생할 수있다

의 사용 (2)의 ThreadLocal

의 ThreadLocal 클래스 인터페이스는 매우 간단합니다, 네 개의 방법은 살펴 보겠습니다 : 

• voidset (Objectvalue) 현재 쓰레드의 쓰레드 로컬 변수의 값을 설정.

 • publicObjectget () 메소드는 반환 현재 스레드에 대응하는 스레드 로컬 변수.

 현재 스레드의 로컬 변수의 값이 삭제됨) • publicvoidremove는 (목적 JDK 5.0에 대한 새로운 방법의 메모리 사용을 감소시키는 것이다. 스레드의 끝, 스레드 지역 변수가 자동으로 쓰레기를해야 할 때, 그래서 명시 적으로 지역 변수가 작동하는 데 필요한되지 않는 스레드를 지우려면이 메소드를 호출하지만 메모리 속도의 회복 속도를 높일 수 있다는 점에주의해야한다.

 • protectedObjectinitialValue는 () 서브 클래스 디자인을 포함 할 수 있도록 분명히 위해, 보호 방법이 thread 로컬 변수의 초기 값을 반환합니다. 실행이 처음 스레드, 한 번만 수행 할 때이 방법은 지연 호출, 통화의 get () 또는 설정 (객체)에 대한 방법입니다. 직접 반환의 기본 ThreadLocal를 널.

publicfinalstaticThreadLocal <문자열> = 새 자원의 ThreadLocal <문자열> (); RESOURCE는 문자열 유형의 객체를 저장하는 능력 ThreadLocal를 나타낸다. 이 때, 하나 개의 스레드가 변수에 액세스 동시에 할 수 있는지에 상관없이, 그것은에 기록됩니다 읽기 작업은 스레드 안전합니다.

 

위의 개별 학습의보기를 대표하는, 우리는 학습 기준을 제공 할 수 있도록 노력하겠습니다

 

게시 18 개 원래 기사 · 원 찬양 4 · 조회수 (140)

추천

출처blog.csdn.net/weixin_42081445/article/details/104828948