Fix/3.x/issue 2721

Issue link: https://github.com/hazelcast/hazelcast/issues/2721

Issue was about in some cases, classloader of caller side can be null (means that caller class is loaded by bootloader such as core java classes) and classloader of current thread may be null.

To solve this issue, try to use classloader of current class and if it is null (this might not be possible) use system classloader.
`run` method should be final to prevent overriding. For example;

```java
protected void beforeRun() {
}

protected abstract void innerRun();

protected void afterRun() {
}

public final void run() {
    try {
        beforeRun();
        innerRun();
    } catch (OutOfMemoryError e) {
        OutOfMemoryErrorDispatcher.onOutOfMemory(e);
    } finally {
        afterRun();
    }
}
```