@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) {abstract} + onError(Exception) {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 : AsyncCallback ~ exception : Exception ~ lock : Object ~ state : int ~ value : T ~ CompletableResult(callback : AsyncCallback) + await() + getValue() : T ~ hasCallback() : boolean + isCompleted() : boolean ~ setException(exception : Exception) ~ setValue(value : T) } } ThreadAsyncExecutor ..|> AsyncCallback ThreadAsyncExecutor ..|> AsyncResult ThreadAsyncExecutor ..|> AsyncExecutor CompletableResult ..+ ThreadAsyncExecutor CompletableResult ..|> AsyncResult @enduml