자바 다 중 스 레 드 빨리 해결 해 줄 게(2)

1.Future 의 도표 구조,전체적으로 보면 Future 의 구조
图片
图片
우선 future 인터페이스의 함 수 를 보 세 요.모두 5 가지 방법 이 있 습 니 다.
get()실행 결 과 를 가 져 옵 니 다.다른 리 셋 은 시간 제한 이 있 는 get 입 니 다.시간 초과 시 이상 이 발생 할 수 있 습 니 다.
isDone()미래 결과 처리 완료 여부 판단
작업 취소
2.future 의 사용,아무리 많은 말 을 해도 무슨 소 용이 있 습 니까?예 를 들 어 몰래 어떻게 사용 합 니까?

package thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* @author   
*/
public class FutureTest {
private ExecutorService bossExecutor = Executors.newSingleThreadExecutor();
public Future<Integer> getHpTask(Integer input) {
return bossExecutor.submit(() -> {
System.out.println("Calculating..." + input);
Thread.sleep(1000);
return input * input;
});
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
Future<Integer> calculate = new FutureTest().getHpTask(100);
System.out.println(calculate.get());
System.out.println("Done");
}
}
3.통속 적 인 이해
future 는 마치 손 으로 떡 을 잡 으 러 가 는 것 과 같다.네가 돈 을 사장 에 게 준 후에 사장 이 너 에 게 내 가 다 만 든 후에 옆 접시 에 놓 을 것 이 라 고 말 했다.이 접 시 는 future 이다.너 는 isDone 으로 접시 에 네가 원 하 는 손 으로 떡 을 잡 는 지 판단 하고 있 으 면 가 져 가라.물론 get()을 기다 리 거나 다른 일 을 하 러 갈 수 있 습 니 다.이따가 다시 가 져 오 세 요.
4.원리
보다

public V get() throws InterruptedException, ExecutionException {
      int s = state;
      if (s <= COMPLETING)
          s = awaitDone(false, 0L);
      return report(s);
  }
  private int awaitDone(boolean timed, long nanos)
      throws InterruptedException {
      final long deadline = timed ? System.nanoTime() + nanos : 0L;
      WaitNode q = null;
      boolean queued = false;
      for (;;) {
          if (Thread.interrupted()) {
              removeWaiter(q);
              throw new InterruptedException();
          }
          int s = state;
          if (s > COMPLETING) {
              if (q != null)
                  q.thread = null;
              return s;
          }
          else if (s == COMPLETING) // cannot time out yet
              Thread.yield();
          else if (q == null)
              q = new WaitNode();
          else if (!queued)
              queued = UNSAFE.compareAndSwapObject(this, waitersOffset,
                                                    q.next = waiters, q);
          else if (timed) {
              nanos = deadline - System.nanoTime();
              if (nanos <= 0L) {
                  removeWaiter(q);
                  return state;
              }
              LockSupport.parkNanos(this, nanos);
          }
          else
              LockSupport.park(this);
      }
  }
위의 코드 를 보면 결 과 를 얻 을 때 상태 가 완성 되 었 는 지 판단 하고 완성 되면 정상적으로 결 과 를 되 돌려 줍 니 다.완성 되 지 않 으 면 awaitDone 을 호출 합 니 다.이름 을 봐 도 완성 될 때 까지 기다 리 는 것 을 알 수 있 습 니 다.코드 에 들 어가 면 순환 검사 상태 에 들 어가 고 스 레 드 가 막 혀 완 료 될 때 까지 기다 리 는 것 을 볼 수 있 습 니 다.쓰 라 고 하면 너 도 이렇게 쓰 는 거 아니 야?
5.총화
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

좋은 웹페이지 즐겨찾기