Как создать поток для 10 идентификаторов, запустить 6 методов параллельно в java, используя многопоточность - PullRequest
0 голосов
/ 11 марта 2020

У меня есть 10 идентификаторов в списке и 6 методов. Мне нужен каждый идентификатор в 6 методах.

Пример:

// передача 1-го идентификатора во все 6 методов, эти 6 методов должен работать параллельно

getBook1(1);
getBook2(1);
getBook3(1);
getBook4(1);
getBook5(1);
getBook6(1);

// передача 2-го идентификатора во всех 6 методах

getBook1(2);
getBook2(2);
getBook3(2);
getBook4(2);
getBook5(2);
getBook6(2);
    .
    .
    .

// передача 10-го идентификатора во всех 6 методах

getBook1(10);
getBook2(10);
getBook3(10);
getBook4(10);
getBook5(10);
getBook6(10);

Когда я передать второй идентификатор во всех 6 методах, параллельно методы 1 идентификатора также должны работать параллельно.
Как и для всех этих 10 идентификаторов, 6 методов должны выполняться параллельно в java. Пожалуйста, помогите мне с решением.

Спасибо за ваш ответ. пожалуйста, проверьте обновленный код ниже.

public class TestClass {
DataSource ds = null;
Connection mysqlcon = null;
PreparedStatement mysqlstmt = null;
ResultSet mysqlrs=null;

public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
    TestClass tc = new TestClass();
    List<String> idsList  = tc.getIpadds();
    ExecutorService executorService =  Executors.newFixedThreadPool(idsList .size());
    Method[] methods = TestClass.class.getMethods();

    for (String id : idsList ) {
        callbookMethod(executorService,id,methods);
    }

}

private List<String> getIpadds() {
    List<String> ipadds = new ArrayList<String>();
    try {
            // MySql Dash Board Connection
            ds = MyDataSourceFactory.getDashBoardMySQLDataSource();
            mysqlcon = ds.getConnection();
            String sql="SELECT DISTINCT IPADD FROM atm_master_copy_3";
            mysqlstmt = mysqlcon.prepareStatement(sql);
            ResultSet mysqlrs =mysqlstmt.executeQuery();

            while(mysqlrs.next()) {
                ipadds.add(mysqlrs.getString(1));
            }

        }catch(SQLException e) {
                e.printStackTrace();
            }finally {
                if(mysqlcon != null) {
                    try {
                        mysqlcon.close();
                    }catch(SQLException e) {
                        e.printStackTrace();
                    }
                    mysqlcon = null;
                }
            }
    return ipadds;
}

public static void callbookMethod (ExecutorService executorService,final String id, final Method[] methods){
    final TestClass testClass = new TestClass();
    executorService.execute(new Runnable() {
        @Override
        public void run() {
            for (Method method : methods) {
                try {
                    String methodName  = method.getName();
                    if (methodName.startsWith("update")) {
                            method.invoke(testClass,id);
                   }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    });
}

public void updateCMaster(String id)  {
     System.out.println("updateCMaster");

}
public void updateFMaster(String id) {
    // Do Something
    System.out.println("updateFMaster");
}
public void updateASMaster(int id) {
    // Do Something
    System.out.println("updateASMaster");
}

}

Я получаю 250 идентификаторов в списке.

1 Ответ

0 голосов
/ 11 марта 2020

Здесь вы go это сделает то, что вы просили, но это не очень хорошая идея, так как вы убьете свою машину, потому что, если размер списка велик:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestClass {


    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {

        int[] idsList = {1,2,3,4,5,6,7,8,9,10};
        ExecutorService executorService =  Executors.newFixedThreadPool(idsList.length);
        Method[] methods = TestClass.class.getMethods();

        for (int id : idsList) {
            callbookMethod(executorService,id,methods);
        }

    }

    public static void callbookMethod (ExecutorService executorService,int id, Method[] methods){
        TestClass testClass = new TestClass();
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                for (Method method : methods) {
                    try {
                        String methodName  = method.getName();
                        if (methodName.startsWith("getBook")) {
                            method. invoke(testClass,id);
                        }
//                        method.invoke(id);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    public void getBook1(int id)  {
        // Do Something
        System.out.println("Book 1:");
    }
    public void getBook2(int id) {
        // Do Something
        System.out.println("Book 2:");
    }
    public void getBook3(int id) {
        // Do Something
        System.out.println("Book 3:");
    }
    public void getBook4(int id) {
        // Do Something
        System.out.println("Book 4:");
    }
    public void getBook5(int id) {
        // Do Something
        System.out.println("Book 5:");
    }
    public void getBook6(int id) {
        // Do Something
        System.out.println("Book 6:");
    }

}
...