@startuml package com.iluwatar.async.method.invocation { class App { - LOGGER : Logger {static} + App() - callback(name : String) : AsyncCallback {static} - lazyval(value : T, delayMillis : long) : Callable {static} - log(msg : String) {static} + main(args : String[]) {static} } interface AsyncCallback { + onComplete(T, Optional) {abstract} } interface AsyncExecutor { + endProcess(AsyncResult) : T {abstract} + startProcess(Callable) : AsyncResult {abstract} + startProcess(Callable, AsyncCallback) : AsyncResult {abstract} } interface AsyncResult { + await() {abstract} + getValue() : T {abstract} + isCompleted() : boolean {abstract} } class ThreadAsyncExecutor { - idx : AtomicInteger + ThreadAsyncExecutor() + endProcess(asyncResult : AsyncResult) : T + startProcess(task : Callable) : AsyncResult + startProcess(task : Callable, callback : AsyncCallback) : AsyncResult } -class CompletableResult { ~ COMPLETED : int {static} ~ FAILED : int {static} ~ RUNNING : int {static} ~ callback : Optional> ~ exception : Exception ~ lock : Object ~ state : int ~ value : T ~ CompletableResult(callback : AsyncCallback) + await() + getValue() : T + isCompleted() : boolean ~ setException(exception : Exception) ~ setValue(value : T) } } CompletableResult ..+ ThreadAsyncExecutor ThreadAsyncExecutor ..|> AsyncExecutor CompletableResult ..|> AsyncResult @enduml