使用Java线程并行/串行执行一组函数
下表包含MyRunnable类中的所有函数/方法名称, !() 对于rfc,我想按顺序执行所有组, 但在每个组中,函数将根据parallel标志并行/串行运行 对于组#1>Main java>shld生成并行线程中的FNC1、FNC33, FNC12只应在标记为平行N的螺纹上启动一次 在完成上一个线程>FNC343时,FNC892应该并行执行 组2>两个都标记为N表示并行,因此其串行线程 组3>连续执行FNC31, FNC32标记为手动,因此手动步骤以上的任何功能都应完成,代码应退出 所以在我的主课上, 在迭代每个组#的for循环中,result set>中的每一行进入if循环,检查是否跳过并创建一个worker,如下所示,在MyRunnable中,使用反射调用方法使用Java线程并行/串行执行一组函数,java,multithreading,Java,Multithreading,下表包含MyRunnable类中的所有函数/方法名称, !() 对于rfc,我想按顺序执行所有组, 但在每个组中,函数将根据parallel标志并行/串行运行 对于组#1>Main java>shld生成并行线程中的FNC1、FNC33, FNC12只应在标记为平行N的螺纹上启动一次 在完成上一个线程>FNC343时,FNC892应该并行执行 组2>两个都标记为N表示并行,因此其串行线程 组3>连续执行FNC31, FNC32标记为手动,因此手动步骤以上的任何功能都应完成,代码应退出 所以在我的
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(串行)。。然后根据结果集返回到串行或并行运行