@startuml

'abstract class AbstractList
'abstract AbstractCollection
'interface List
'interface Collection
'
'List <|-- AbstractList
'Collection <|-- AbstractCollection
'
'Collection <|- List
'AbstractCollection <|- AbstractList
'AbstractList <|-- ArrayList
'
'class ArrayList {
'Object[] elementData
'size()
'}
'
'enum TimeUnit {
'DAYS
'HOURS
'MINUTES
'}

abstract class Scheduler{

Disposable scheduleDirect(Runnable run, long delay, TimeUnit unit)
Worker createWorker()

}

abstract class Worker{
Disposable schedule(Runnable run, long delay, TimeUnit unit)
}

interface Runnable{
void run()
}

interface Disposable{
void dispose()
boolean isDisposed()
}

class HandlerScheduler{
Handler handler
}

class HandlerWorker{
Handler handler
}

class ScheduledRunnable{
Handler handler
Runnable delegate
}

Disposable <|-- Worker
Scheduler <|-- HandlerScheduler
Worker <|-- HandlerWorker
Disposable <|-- ScheduledRunnable
Runnable <|-- ScheduledRunnable


@enduml