Create a TestNG runner class for each running thread using Cucumber

I'm writing a framework that uses TestNG and Appium in order to conduct mobile app tests in parallel. Right now i'm trying to implement Cucumber into the framework, which requires a TestNG runner class in order to run the Cucumber tests (see below).

package org.cucumber.tests;

        plugin = {
        "com.cucumber.listener.ExtentCucumberFormatter:" }, monochrome = true)

public class TestNGRunner extends BaseTest {

    private static TestNGCucumberRunner testRunner;

    public void setUP() {   
        testRunner = new TestNGCucumberRunner(TestNGRunner.class);
        ExtentProperties extentProperties = ExtentProperties.INSTANCE;
        extentProperties.setReportPath("output/" + this.hashCode() + "-report.html");

    public void setUpClass(CucumberFeatureWrapper cFeature) {

    public Object[][] getFeatures() {
        return testRunner.provideFeatures();

    public static void teardown() {


I have my tests running in parallel on each connected mobile device using ThreadLocal AppiumDriver (WebDriver) instances and specifying parameters in my testNG.xml file within <test> tags and setting the parallelism to 'tests', example:-

<suite name="Parallel Testing" verbose="1" parallel="tests">

        <test name="Samsung Galaxy S7">
        <parameter name="platform" value="Android 6.0.1" />
        <parameter name="udid" value="#############" />
        <parameter name="browserName" value="Chrome" />
        <parameter name="chromeDriverPort" value="9515" />
        <parameter name="systemPort" value="8201" />
        <parameter name="deviceName" value="Samsung Galaxy S7" />

      <package name="org.cucumber.tests"/>

 <test name="Nexus 6P">
    <parameter name="platform" value="Android 7.1.1" />
    <parameter name="udid" value="########" />
    <parameter name="browserName" value="Chrome" />
    <parameter name="chromeDriverPort" value="9516" />
    <parameter name="systemPort" value="8202" />
    <parameter name="deviceName" value="Nexus 6P" />
  <package name="org.cucumber.tests"/>

When it comes to generating a report using ExtentReports, all the tests from every running thread are placed into the same report - see below example.

Extent Report

My understanding of this is that the ExtentProperties.INSTANCE is shared between each of the running threads, so the file path is always overridden.

What i would like is an indiviual report for each running thread, which results in a report for each connected mobile device.

Presumably what i need to do is create a separate instance of the TestNGRunner class for each running thread. My question is - is this actually possible and if so, do i need to change my approach?