A는 상대적으로 자바 8 최근 published article about replacing executors by actors은 익명의 내부 클래스 Runnable
를 사용과 같이 밝혔다 작업은 :보다 Runnable 대 방법 참조 및 쓰레기
Actor<String> actor = new Actor<>(parentExecutor, ::onMessage);
// Equivalent functional operation
actor.act("Hello world");
public void onMessage(String message) {
System.out.println(message);
}
이 one should generally use method references over anonymous inner classes (즉 new Runnable
, new Callable
) 그 의미가 있습니다. 그 아이디어는 잠시 동안 주변에 있었다. 이 액터 패턴을 사용하는 것이 더 효율적이지만이 기사에서 명시 적으로 설명하지 않은 또 다른 미묘한 부분이있는 것처럼 보입니다.
executor.execute(() -> System.out.println(data));
분명히 비효율적 일 것 (조금이라도) 컴파일러가 있기 때문에 생성 방법 invokedynamic
"호출 사이트"를 생성하고 호출 할 때를 참조 :
내가 사용하는 것으로 알고 있습니다.
의 이점 (1) 직접있어서 기준이invokedynamic
방법 생성, (2) 수는 별도로이 직접 기준에있어서의 파라미터를 전달할 수있게하는 오버 헤드가 발생하지 않는 것을 여기 있어요? 이 아이디어에서 우리가 이미 알고 사용하고있는 패턴에 대한 핵심 아이디어는 무엇입니까?
첫 번째 연결된 기사가 잘못되었습니다. 더 많은 GC 친숙하지 않다. 각 메소드 참조를위한 객체를 생성해야하기 때문이다. 방금 익명의 클래스 객체를 다른 유형의 객체로 대체했습니다. 메소드 참조 나 람다가 새로운 클래스를 생성하지 않고 두 번째 링크의 포인트이지만 개선 된 GC의 첫 번째 링크에있는 포인트가 잘못 되었기 때문에 클래스가 아니기 때문에 더 나은 클래스입니다. 웹에서 찾은 모든 것을 믿지 마십시오. – Andreas
@ Andreas 내가 말하는 것이 사실이라면 나는 놀랐다. GC 친화적이지 않습니다. 저는 Clebert Suconic - 새로운 ActiveMQ에 관한 기사와 Apache Apache 커미터의 저자 - 그 말을하기 전에 숙제를했을 것입니다. – Dovmo
@Andreas 익명의 클래스가 엔코 드 객체를 캡쳐하는 반면, 람다 또는 메소드 참조는 필요한 부분 만 캡처합니다. 어쩌면 그것이 GC 친화적이라는 의미일까요? – maaartinus