如何创建一个对象列表并一个一个地执行它们?

How to crate a list of objects and execute them one by one?

我需要创建一个对象列表并在 2-3 个线程中一个一个地执行它们。当第一个对象完成执行时,另一个对象开始在它的位置执行。所有对象都是具有不同输入参数的相同 class 的成员。这个 class 可以有很多对象,因此我不能像下面写的那样对它们进行硬编码。我喜欢找到解决这个问题的最佳方法。

// The simple class. He do nothing 
public class SomeClsass implements Runnable{

    run(){
        sum();
    }
    
    // The simple function
    private void sum(){
        
        // Some code. It doesn't meaning 
        int j =0;
        for(int i=0; i<=10000; i++){
            j=i; 
            
        }
    }
}

public static void main(String args[]){
    
    // I don't wont to create objects as here
    SomeClass someClass = new SomeClass();
    SomeClass someClass1 = new SomeClass();
    SomeClass someClass2 = new SomeClass();
    SomeClass someClass3 = new SomeClass();
    // ...... more then 1000 objects
    
    
    // When this two objects finishes one by one next object will starts executing 
    someClass.run();
    someClass1.run();
    

}

使用ThreadPoolExecutor.

ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 0; i < 1000; i++) {
  SomeClass sc = ....;
  executor.submit(sc);
}
executor.shutdown();
executor.awaitTermination(100, TimeUnit.HOURS);

我也建议使用 Executors.newFixedThreadPool,但用 try catch 语句包装它。

ExecutorService service = null;
try {
  service = Executors.newFixedThreadPool(3);

  SomeClass someClass = new SomeClass();

  for (int i = 0; i < 10; i++) {
    service.submit(someClass); // Here you could also use a lambda instead of implementing the Runnable interface (() -> someClass.sum())
  }
finally {
  if (service != null) service.shutdown();
}

上面的例子展示了如何使用多线程并发执行你的一段代码,但它不是线程安全的。如果你想让多个线程一个一个地执行你的 sum() 方法,你可以在你的 sum() 方法签名中或在 try catch 块中使用同步 (synchronize(someClass) { for... })

Java 并发 API 中还有其他功能可用于这种情况。我建议您在选择之前先查看它们,因为还有其他线程安全的选项,例如原子 类、同步块、Lock 框架和循环屏障。但是上面的例子是完全可以用的