초보 장면 자바 스 레 드 관련 문제 및 해결 방안

1.스 레 드 생 성 방식
a.스 레 드 클래스(new Thread)를 계승 하고 run 방법 을 다시 씁 니 다.

public class MyThread extends Thread{//  Thread 
  public void run(){
  //  run  
  }
}
public class Main {
public static void main(String[] args){
    new MyThread().start();//       
  }
}
b.runnable 인 터 페 이 스 를 실현 하고 runnable 대상 을 Thread 클래스 에 전송 합 니 다.

public class MyThread2 implements Runnable {//  Runnable  
  public void run(){
  //  run  
  }
}
public class Main {
  public static void main(String[] args){
    //       
    MyThread2 myThread=new MyThread2();
    Thread thread=new Thread(myThread);
    thread().start();
    //    new Thread(new MyThread2()).start();
  }
}
c.스 레 드 풀 방식 으로 runnable 또는 callable 작업 을 제출 합 니 다.

public class Main {
  public static void main(String[] args){
   MyThread3 th=new MyThread3();
   //  Lambda     Callable  
   //  FutureTask    Callable  
   FutureTask<Integer> future=new FutureTask<Integer>(
    (Callable<Integer>)()->{
      return 5;
    }
   );
   new Thread(task,"       ").start();//      Callable          
   try{
    System.out.println("       :"+future.get());//get()     ,            
   }catch(Exception e){
    ex.printStackTrace();
   }
  }
}
d.세 번 째 방식 을 추천 합 니 다.효율 적 이 고 자원 을 제어 할 수 있다.
2.무엇이 스 레 드 동기 화 입 니까?스 레 드 동기 화 는 언제 사용 합 니까?
1)스 레 드 동기 화 는 무엇 입 니까?
즉,하나의 스 레 드 가 메모 리 를 조작 할 때 다른 스 레 드 는 이 메모리 주 소 를 조작 할 수 없습니다.이 스 레 드 가 완 료 될 때 까지 다른 스 레 드 는 이 메모리 주 소 를 조작 할 수 있 고 다른 스 레 드 는 대기 상태 에 있 습 니 다.
2)스 레 드 는 언제 사용 합 니까?
쉽게 말 하면 동기 화 는 여러 스 레 드 가 같은 대상 에 접근 하 는 것 을 방지 하고 데이터 가 안전 하지 않 습 니 다.스 레 드 의 동기 화 는 안전 을 의미 합 니 다.예 를 들 어 당신 이 돈 을 찾 으 러 가 는 경우,당신 의 집행 문 구 는 내 가 사용 하 는 것 과 같은 대상 이 라면,당신 은 카드 에서 공제 한 금액 과 은행 카드 안에 이렇게 많은 돈 이 있어 야 공제 할 수 있 습 니 다.
3.스 레 드 안전 이 무엇 입 니까?
1)스 레 드 안전 이란 여러 스 레 드 가 동시에 실 행 된 상황 에서 결 과 는 항상 단일 스 레 드 가 실 행 된 결과 와 일치 하고 논리 적 으로 오류 가 발생 하지 않 습 니 다.
2)어떤 상황 에서 라인 안전 문제 가 발생 합 니까?
여러 개의 스 레 드 가 같은 데 이 터 를 동시에 조작 하면 스 레 드 안전 문 제 를 초래 할 수 있다.예 를 들 어 전체적인 변수,정적 변수,같은 데이터 의 데이터 베이스 작업 등;
부분 변 수 는 일반적으로 스 레 드 안전 문제 가 존재 하지 않 습 니 다.
3)흔히 볼 수 있 는 라인 안전 해결 방법:
1)전역 변 수 를 사용 하지 않 고 전역 변 수 를 국부 변수 로 정의 합 니 다.
2)동기 화 잠 금 을 추가 하여 스 레 드 를 동기 화 합 니 다.
a.Synchronized 동기 화 키 워드 는 방법 과 코드 블록 에 추가 할 수 있 습 니 다.

/**
   * synchronized       ,         
   *        ,    class
   *        ,   this,     synchronized(this)
   *                     ,         
   */

  public static synchronized void salTicket(){
    if (ticketNum > 0) {
      try {
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(Thread.currentThread().getName() + "   " + ticketNum-- + "  ");
      System.out.println(Thread.currentThread().getName() + "    ");
    }else {
      System.out.println("     ,"+Thread.currentThread().getName() + "    ");
    }
  }
b.여러 스 레 드 방법 이 동기 화 되 는 지 여 부 는 여러 스 레 드 가 같은 자 물 쇠 를 공유 하 는 지 판단 해 야 합 니 다.

/**
   *      
   */
  public void salTicket2() {
    synchronized (this) {
      //()      ,this      ,                 ,    
      //      class,                  
      if (ticketNum > 0) {
        try {
          Thread.sleep(100);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "   " + ticketNum-- + "  ");
        System.out.println(Thread.currentThread().getName() + "    ");
      } else {
        System.out.println("     ," + Thread.currentThread().getName() + "    ");
      }
    }
  }
c.ReentrantLock 대상 의 lock 방법 은 자 물 쇠 를 추가 하고 unLock 은 자 물 쇠 를 해제 합 니 다.언 락 은 finally 에 넣 어야 합 니 다.최종 적 으로 자 물 쇠 를 풀 수 있 도록 확보 하기;

//    private static ReentrantLock lock=new ReentrantLock();
 /**
   *   lock      ,           lock  ,      
   */
  public void salTicket3() {
    lock.lock();//  
      if (ticketNum > 0) {
        try {
          Thread.sleep(100);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }finally {
          lock.unlock();//   ,    finally    ,        
        }
        System.out.println(Thread.currentThread().getName() + "   " + ticketNum-- + "  ");
        System.out.println(Thread.currentThread().getName() + "    ");
      } else {
        System.out.println("     ," + Thread.currentThread().getName() + "    ");
      }
  }
3)데이터 베 이 스 를 조작 하면 낙관적 인 잠 금 또는 비관 적 인 잠 금 방식 도 사용 할 수 있다.
4)Springmvc 는 어떻게 라인 안전 문 제 를 해결 합 니까?
Springmvc 의 데이터 수신 과 전달 은 모두 방법 등급 이 고 국부 변 수 를 사용 하여 수신 하고 전달 하기 때문에 라인 안전 문제 가 존재 하지 않 습 니 다.
4.Wait 와 notify
스 레 드 간 통신 의 메커니즘스 레 드 간 전환 을 수 동 으로 제어 합 니 다.동기 코드 의 잠 금 대상 호출.동시에 공유 메모리 대상 을 통 해 데이터 의 전달 을 실현 할 수 있다.
  • Wait 는 스 레 드 를 차단 상태 에 들 어가 게 하고 잠 금 자원 을 방출 합 니 다.
  • Notify 는 wait 로 인해 차단 상태 에 들 어간 스 레 드 를 무 작위 로 깨 웁 니 다.
  • NotifyALL 은 wait 로 인해 차단 상태 에 들 어간 모든 스 레 드 를 깨 웁 니 다.
  • 3)다 중 스 레 드 실현,어떻게 사용 합 니까?
    a.하나의 큰 임 무 를 여러 개의 작은 임무 로 나 누 어 다 중 스 레 드 로 수행 합 니 다.
    다 중 스 레 드 의 효율 이 반드시 단일 스 레 드 의 효율 보다 높 은 것 은 아니다.
    스 레 드 탱크 를 통 해 스 레 드 를 만 들 고 runnable(반환 값 없 음)이나 callable(반환 값 있 음)인 터 페 이 스 를 통 해 작업 을 정의 합 니 다.
    스 레 드 탱크 의 submit invoke invokeAll 등 방법 으로 임 무 를 수행 합 니 다.
    b.스 레 드 비동기 로 특정한 임 무 를 완성 하고 동시 응답 능력 을 향상 시 키 거나 스 레 드 가 주기 적 으로 특정한 임 무 를 수행 하도록 합 니 다.
    c.네 가지 스 레 드 탱크 의 특징 과 생 성;
    자바 는 Executors 를 통 해 네 가지 스 레 드 풀 을 제공 합 니 다.각각:
    1)new CachedThreadPool 은 캐 시 가능 한 스 레 드 풀 을 만 듭 니 다.스 레 드 풀 의 길이 가 처리 수 요 를 초과 하면 남 은 스 레 드 를 유연 하 게 회수 할 수 있 습 니 다.회수 할 수 없 으 면 새 스 레 드 를 만 듭 니 다.
    2)new Fixed ThreadPool 은 스 레 드 의 최대 병발 수 를 제어 할 수 있 는 스 레 드 풀 을 만 들 고 초과 한 스 레 드 는 대기 열 에서 기다 릴 것 입 니 다.
    3)new Scheduled ThreadPool 은 정기 적 이 고 주기 적 인 작업 수행 을 지원 하 는 고정 라인 풀 을 만 듭 니 다.
    4)new Single ThreadExecutor 는 단일 라인 화 된 스 레 드 풀 을 만 듭 니 다.유일한 작업 스 레 드 로 만 작업 을 수행 하고 모든 작업 이 지 정 된 순서(FIFO,LIFO,우선 순위)에 따라 실 행 될 수 있 도록 합 니 다.
    
    //jdk                
        //1.     
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
        //2.     
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        //3.     ,         
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
        //4.      
        ExecutorService executorService = Executors.newSingleThreadExecutor();
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기