如何为10个ID创建线程,使用多线程在java中并行运行6个方法

如何为10个ID创建线程,使用多线程在java中并行运行6个方法,java,multithreading,multitasking,Java,Multithreading,Multitasking,我在列表中有10个id和6个方法。我需要在6个方法中找到每个id 例如: //通过所有6个方法中的第一个id,这6个方法应该并行运行 getBook1(1); getBook2(1); getBook3(1); getBook4(1); getBook5(1); getBook6(1); //在所有6种方法中通过第二个id getBook1(2); getBook2(2); getBook3(2); getBook4(2); getBook5(2); getBook6(2); .

我在列表中有10个id和6个方法。我需要在6个方法中找到每个id

例如:

//通过所有6个方法中的第一个id,这6个方法应该并行运行

getBook1(1);
getBook2(1);
getBook3(1);
getBook4(1);
getBook5(1);
getBook6(1);
//在所有6种方法中通过第二个id

getBook1(2);
getBook2(2);
getBook3(2);
getBook4(2);
getBook5(2);
getBook6(2);
    .
    .
    .
getBook1(10);
getBook2(10);
getBook3(10);
getBook4(10);
getBook5(10);
getBook6(10);
//在所有6种方法中通过第10个id

getBook1(2);
getBook2(2);
getBook3(2);
getBook4(2);
getBook5(2);
getBook6(2);
    .
    .
    .
getBook1(10);
getBook2(10);
getBook3(10);
getBook4(10);
getBook5(10);
getBook6(10);
当我在所有6个方法中传递第2个id时,并行的1个id方法也应该并行运行。
与所有这10个ID一样,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");
}
公共类TestClass{
数据源ds=null;
连接mysqlcon=null;
PreparedStatement mysqlstmt=null;
结果集mysqlrs=null;
公共静态void main(字符串[]args)抛出InvocationTargetException、IllegalAccessException{
TestClass tc=新的TestClass();
List idsList=tc.getIpadds();
ExecutorService ExecutorService=Executors.newFixedThreadPool(idsList.size());
方法[]methods=TestClass.class.getMethods();
用于(字符串id:idsList){
callbookMethod(executorService、id、methods);
}
}
私有列表getIpadds(){
List ipadds=新建ArrayList();
试一试{
//MySql仪表板连接
ds=MyDataSourceFactory.getDashBoardMySQLDataSource();
mysqlcon=ds.getConnection();
String sql=“从atm\u master\u copy\u 3中选择不同的IPADD”;
mysqlstmt=mysqlcon.prepareStatement(sql);
ResultSet mysqlrs=mysqlstmt.executeQuery();
while(mysqlrs.next()){
add(mysqlrs.getString(1));
}
}捕获(SQLE异常){
e、 printStackTrace();
}最后{
如果(mysqlcon!=null){
试一试{
mysqlcon.close();
}捕获(SQLE异常){
e、 printStackTrace();
}
mysqlcon=null;
}
}
返回IPADD;
}
公共静态void callbookMethod(ExecutorService ExecutorService,最终字符串id,最终方法[]方法){
最终TestClass TestClass=新TestClass();
executorService.execute(新的Runnable(){
@凌驾
公开募捐{
用于(方法:方法){
试一试{
String methodName=method.getName();
if(methodName.startsWith(“更新”)){
invoke(testClass,id);
}
}捕获(例外e){
e、 printStackTrace();
}
}
}
});
}
public void updatemaster(字符串id){
System.out.println(“updateMaster”);
}
公共void updateMaster(字符串id){
//做点什么
System.out.println(“updateMaster”);
}
public void updateASMaster(int-id){
//做点什么
System.out.println(“updateASMaster”);
}
}


我在列表中获得了250个ID。

给你,这将满足你的要求,但这不是一个好主意,因为你会杀死你的机器,因为如果列表太大:

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:");
    }

}

所以你想在所有id上循环,并为每个id启动6个线程!是的,当我在所有6个方法中传递第2个id时,并行的6个方法也应该使用第1个id运行。@AMASo活动线程的总数将是list.size*6?在您的情况下,列表大小为10,因此总数将为60!!!是的,你说得对。你能帮我解决这个问题吗?谢谢你的回复。抱歉,我刚才在问题中提到了示例方法名称,但它们有不同的方法名称。如果(methodName.startsWith(“getBook”))我必须在sun.reflect.GeneratedMethodAccessor3.invoke(未知源)在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知源)在java.lang.reflect.Method.invoke(未知源)在com.in.TestClass$1.run(TestClass.java:76)在这里执行的操作java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)java.lang.Thread.run(未知源)获取此方法UpdateMaster的此exceptionParameter类型为int,并将id作为字符串发送,这是检查UpdateMaster方法接受字符串public void UpdateMaster(字符串id){//Do Something System.out.println(“UpdateMaster”+id);}或者您可以这样做##public static void callbookMethod(ExecutorService ExecutorService,final String id,final Method[]methods){TestClass TestClass=new TestClass();ExecutorService.execute(new Runnable(){@Override public void run(){TestClass.updatemaster(id);testClass.UpdateMaster(id);testClass.UpdateMaster(id);}}}}不需要运行()ah@AMA内的for循环