使用Java线程并行/串行执行一组函数

使用Java线程并行/串行执行一组函数,java,multithreading,Java,Multithreading,下表包含MyRunnable类中的所有函数/方法名称, !() 对于rfc,我想按顺序执行所有组, 但在每个组中,函数将根据parallel标志并行/串行运行 对于组#1>Main java>shld生成并行线程中的FNC1、FNC33, FNC12只应在标记为平行N的螺纹上启动一次 在完成上一个线程>FNC343时,FNC892应该并行执行 组2>两个都标记为N表示并行,因此其串行线程 组3>连续执行FNC31, FNC32标记为手动,因此手动步骤以上的任何功能都应完成,代码应退出 所以在我的

下表包含MyRunnable类中的所有函数/方法名称, !()

对于rfc,我想按顺序执行所有组, 但在每个组中,函数将根据parallel标志并行/串行运行

对于组#1>Main java>shld生成并行线程中的FNC1、FNC33, FNC12只应在标记为平行N的螺纹上启动一次 在完成上一个线程>FNC343时,FNC892应该并行执行

组2>两个都标记为N表示并行,因此其串行线程

组3>连续执行FNC31, FNC32标记为手动,因此手动步骤以上的任何功能都应完成,代码应退出

所以在我的主课上, 在迭代每个组#的for循环中,result set>中的每一行进入if循环,检查是否跳过并创建一个worker,如下所示,在MyRunnable中,使用反射调用方法

worker = new MyRunnable(met_name,met_num,rfc_num);
executor.execute(worker);
MyRunnable代码段:

 public class MyRunnable implements Runnable {
 private String mname;
 protected int rfc_num;
 protected int met_num;

public MyRunnable() {
    // Do nothing - no args constructor

}

public MyRunnable(String mname,int met_num,int rfc_num) {
    this.mname=mname;
    this.rfc_num=rfc_num;
    this.met_num=met_num;
    // TODO Auto-generated constructor stub
}

protected static void FNC12(int mnum,int rnum){ System.out.println("Running code for FNC12");}

   // All other functions here

@Override
public void run() {
    System.out.println("INSIDE RUN:"+mname+" "+rfc_num+" "+met_num);
    Method Call_met;
    try {
            Class<?> base = Class.forName("test.MyRunnable");
            Call_met = base.getDeclaredMethod(mname, int.class,int.class);
            System.out.println(mname+" "+rfc_num+" "+met_num);
            Call_met.invoke(base.newInstance(),met_num,rfc_num);
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e ) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


}

}
公共类MyRunnable实现Runnable{
私有字符串mname;
受保护的整数rfc_num;
受保护的整数;
公共MyRunnable(){
//不执行任何操作-无参数构造函数
}
公共MyRunnable(字符串mname、int met\u num、int rfc\u num){
this.mname=mname;
this.rfc_num=rfc_num;
this.met\u num=met\u num;
//TODO自动生成的构造函数存根
}
受保护的静态无效FNC12(int mnum,int rnum){System.out.println(“FNC12的运行代码”);}
//这里的所有其他功能
@凌驾
公开募捐{
System.out.println(“内部运行:+mname+”“+rfc\u num+”“+met\u num”);
方法调用;
试一试{
Class base=Class.forName(“test.MyRunnable”);
Call_met=base.getDeclaredMethod(mname,int.class,int.class);
System.out.println(mname+“”+rfc\u num+“”+met\u num);
调用met.invoke(base.newInstance(),met\u num,rfc\u num);
}捕获(实例化异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}catch(classnotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(无此方法例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(安全异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(非法访问例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IllegalArgumentException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(调用TargetException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
到目前为止,我无法在组中遇到“并行否”时停止/完成线程 或者在新线程中串行运行并行的N个函数。任何人都可以帮助您了解代码或逻辑吗?

请使用。它消除了手动创建/启动/连接线程的需要。将主方法中的模式用于工作的平行部分

package com.stackoverflow.q51518249;

import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;

public class MultiThreading {
    public static void main(final String[] args) {
        final ForkJoinPool pool = ForkJoinPool.commonPool();

        // execute 10 tasks
        for (int i = 0; i < 10; i++) {
            pool.execute(new MyRunnable(i));
        }

        pool.awaitQuiescence(5, TimeUnit.SECONDS);
    }

    public static final class MyRunnable implements Runnable {
        private final int number;

        public MyRunnable(final int number) {
            this.number = number;
        }

        @Override
        public void run() {
            System.out.println("Thread " + number + " started.");

            // business logic

            System.out.println("Thread " + number + " finished.");
        }
    }
}

抱歉,没有时间深入挖掘,但也许您应该调查ThreadPoolExecutor类:您可以创建尽可能多的threadPool组,并将作业提交给该池。对于没有并行性,您可以使用大小为1的踏板池(因此任务将是连续的),对于并行性,您可以使用大型线程池。希望能有帮助……是的。。我开始阅读,我的问题是,在10个方法中,我可能只有1-2个方法是并行的。没有,所以需要将这些方法分成初始并行、串行、并行组。我已经在代码中使用ExecutorService,ExecutorService executor=Executors。newFixedThreadPool(MYTHREADS); .... worker=newmyrunnable(met\u name、met\u num、RFC\u num);执行人,执行人(工人);我的问题是等待线程在组内停止,因为下一个方法是并行no(串行)。。然后根据结果集返回到串行或并行运行