将数据拆分为实现 Runnable 的对象,然后将它们传递给新线程。
在这种情况下拥有四个以上的线程不会杀死你,但你不能获得比核心更多的并行工作(如评论中所述) - 如果线程多于核心,系统将不得不处理谁去什么时候。
如果我有一个班级客户,并且我想发布一个线程来优先考虑更大集合中的 8000 个客户,我可能会执行以下操作:
public class CustomerClassifier implements Runnable {
private customer[] customers;
public CustomerClassifier(customer[] customers) {
this.customers = customers;
}
@Override
public void run() {
for (int i=0; i< customers.length; i++) {
classify(customer);//critical that this classify function does not
//attempt to modify a resource outside this class
//unless it handles locking, or is talking to a database
//or something that won't throw fits about resource locking
}
}
}
然后在其他地方发布这些线程
int jobSize = 8000;
customer[] customers = new customer[jobSize]();
int j = 0;
for (int i =0; i+j< fullCustomerArray.length; i++) {
if (i == jobSize-1) {
new Thread(new CustomerClassifier(customers)).start();//run will be invoked by thread
customers = new Customer[jobSize]();
j += i;
i = 0;
}
customers[i] = fullCustomerArray[i+j];
}
如果您的分类方法在某处影响相同的资源,则您将不得不实施锁定,并且还会在某种程度上扼杀您获得的优势。
并发非常复杂,需要很多思考,我还建议查看 oracle 文档http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html
(我知道链接不好,但希望oracle 文档不会移动太多?)
免责声明:我不是并发设计或多线程(不同主题)方面的专家。