자바 다 중 스 레 드 기술 에서 사용 하 는 방법 을 분석 하 다.

1.run()과 start()
    이 두 가지 방법 은 모두 비교적 익숙 해 야 한다.병행 처리 해 야 할 코드 를 run()방법 에 두 고 start()방법 으로 스 레 드 를 시작 하면 자동 으로 run()방법 을 호출 할 것 이다.이것 은 자바 의 메모리 체제 에 의 해 규정된 것 이다.또한 run()방법 은 Public 접근 권한 이 어야 합 니 다.반환 값 형식 은 void 입 니 다.
   
2.키워드 동기 화
    이 키 워드 는 공유 데 이 터 를 보호 하 는 데 사 용 됩 니 다.물론 어떤 데이터 가 공유 데이터 인지 구분 해 야 합 니 다.대상 마다 하나의 스 레 드 가 대상 에 접근 할 때 Synchronized 에 의 해 수 정 된 데 이 터 는'잠 금'되 어 다른 스 레 드 의 접근 을 막 습 니 다.현재 스 레 드 가 이 부분 데 이 터 를 방문 한 후에 잠 금 표 지 를 풀 면 다른 스 레 드 에 접근 할 수 있 습 니 다.
public ThreadTest implements Runnable
{
public synchronized void run(){
for(int i=0;i<10;i++)
{
System.out.println(" " + i);
}
}
public static void main(String[] args)
{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}

    이 프로그램의 i 변 수 는 데 이 터 를 공유 하 는 것 이 아 닙 니 다.즉,여기 있 는 Synchronized 키 워드 는 작 동 하지 않 습 니 다.t1,t2 두 스 레 드 는 두 대상(r1,r2)의 스 레 드 이기 때 문 입 니 다.서로 다른 대상 의 데 이 터 는 다 르 기 때문에 r1 과 r2 두 대상 의 i 변 수 는 데 이 터 를 공유 하 는 것 이 아 닙 니 다.
    코드 를 다음 과 같이 바 꿀 때:Synchronized 키워드 가 작 동 합 니 다.
Runnable r = new ThreadTest();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();

   
3.sleep()
    현재 스 레 드(즉,이 방법 을 호출 하 는 스 레 드)를 일정 시간 동안 중단 시 키 고 다른 스 레 드 가 계속 실 행 될 수 있 도록 합 니 다.그러나 대상 자 물 쇠 를 풀 지 않 습 니 다.즉,Synchronized 동기 화 블록 이 있 으 면 다른 스 레 드 는 공유 데 이 터 를 방문 하지 않 는 다.이 방법 은 이상 을 포착 해 야 합 니 다.
    예 를 들 어 두 개의 스 레 드 가 동시에 실 행 됩 니 다(Synchronized 가 없 음).한 스 레 드 의 우선 순 위 는 MAX 입 니 다.PRIORITY,다른 하 나 는 MINPRIORITY,Sleep()방법 이 없 으 면 높 은 우선 순위 의 스 레 드 가 실 행 된 후에 만 낮은 우선 순위 의 스 레 드 가 실 행 될 수 있 습 니 다.그러나 높 은 우선 순위 의 스 레 드 sleep(5000)이후 낮은 우선 순위 가 실 행 될 기회 가 있 습 니 다.
    한 마디 로 하면 sleep()는 낮은 우선 순위 의 스 레 드 를 실행 할 수 있 는 기 회 를 얻 을 수 있 습 니 다.물론 같은 우선 순위,높 은 우선 순위 의 스 레 드 를 실행 할 수 있 습 니 다.
   
4.join()
    join()방법 은 이 방법 을 호출 하 는 스 레 드 를 그 전에 실 행 했 습 니 다.즉,이 방법 을 호출 하 는 스 레 드 가 실 행 된 후에 계속 실행 하 는 것 입 니 다.이 방법 도 이상 을 포착 해 야 합 니 다.
   
5.yield()
    이것 은 sleep()와 유사 합 니 다.사용자 가 지정 한 일시 정지 시간 이 얼마 되 지 않 을 뿐 이 며,yield()방법 은 같은 우선 순위 의 스 레 드 만 실행 할 수 있 습 니 다.
   
6.wait()와 notify(),notify All()
    이 세 가지 방법 은 여러 스 레 드 가 공유 데이터 에 대한 접근 을 조정 하 는 데 사용 되 기 때문에 Synchronized 구문 블록 에서 이 세 가지 방법 을 사용 해 야 합 니 다.앞에서 말 했 듯 이 Synchronized 라 는 키 워드 는 공유 데 이 터 를 보호 하고 다른 스 레 드 가 공유 데이터 에 대한 접근 을 막 는 데 사 용 됩 니 다.그러나 이러한 프로그램의 프로 세 스 가 매우 원활 하지 않 습 니 다.어떻게 해야만 현재 스 레 드 가 Synchronized 데이터 블록 을 종료 하지 않 았 을 때 다른 스 레 드 도 공유 데 이 터 를 방문 할 수 있 습 니까?이때 이 세 가지 방법 으로 유연 하 게 제어 한다.
    wait()방법 은 현재 스 레 드 를 일시 정지 시 키 고 대상 잠 금 표 지 를 방출 하여 다른 스 레 드 가 Synchronized 데이터 블록 에 들 어 갈 수 있 도록 합 니 다.현재 스 레 드 는 대상 대기 탱크 에 들 어 갑 니 다.notify()방법 을 호출 하면 대상 의 대기 탱크 에서 임의의 스 레 드 를 이동 하고 잠 금 표지 대기 탱크 에 넣 습 니 다.잠 금 표지 대기 탱크 의 스 레 드 만 잠 금 표 지 를 얻 을 수 있 습 니 다.잠 금 표지 대기 탱크 에 스 레 드 가 없 으 면 notify()가 작 동 하지 않 습 니 다.notify All()은 대상 대기 탱크 에서 그 대상 을 기다 리 는 모든 스 레 드 를 옮 겨 잠 금 표지 대기 탱크 에 넣 습 니 다.

좋은 웹페이지 즐겨찾기