如何创建一个对象列表并一个一个地执行它们?
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();
}
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 框架和循环屏障。但是上面的例子是完全可以用的
我需要创建一个对象列表并在 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();
}
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 框架和循环屏障。但是上面的例子是完全可以用的