努力了解这里到底发生了什么,如下所示,工作和并发运行都很好:
public class Main {
private static final char[] alphabet = "eaistnrulodmpcvqgbfjhzxykw0123456789!@#$%&*".toCharArray();
public static void main(String[] args) throws ExecutionException, InterruptedException {
int cores = Runtime.getRuntime().availableProcessors();
System.out.println("Number of cores: " + cores); //8 cores
int partitionSize = alphabet.length / cores;
ExecutorService service = Executors.newFixedThreadPool(cores);
List<Future> futures = new ArrayList<Future>();
for (int c = 0; c < cores; c++) {
char[] part = Arrays.copyOfRange(alphabet, c * partitionSize, (c + 1) * partitionSize);
futures.add(service.submit(new BruteWorker(part)));
}
for(Future f : futures)
f.get();
service.shutdown();
System.out.println("Completed normally");
}
public static class BruteWorker implements Runnable {
private char[] partition;
BruteWorker(char[] partition) {
this.partition = partition;
}
public void run() {
System.out.println("New thread (id = "+ Thread.currentThread().getId() +")");
for (long nbTries = 0; nbTries < 1_000_000_000L; nbTries ++ ) {
if((nbTries % 10_000_000) == 0){
System.out.println(nbTries + " tries on thread id = "+ Thread.currentThread().getId());
}
}
System.out.println("End of thread (id = "+ Thread.currentThread().getId() +")");
}
}
}
Also available (with output) as a gist
.
请注意,这是对你的代码的一次破解。
我确实注意到您的代码似乎使用了对
MessageDigest
和
Map<String,String>
。有可能您的任务实际上在其他线程上失败,而您只是没有发现这一点,因为您在等待其他长时间运行的任务时被阻止了。
尝试捕获运行方法中的所有异常并转储堆栈跟踪,这可能会有所启发:
public void run() {
System.out.println("New thread (id = "+ Thread.currentThread().getId() +")");
try {
md = MessageDigest.getInstance("MD5");
for(char c : this.partition){
stringPossibilities(String.valueOf(c), maxLength);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("End of thread (id = "+ Thread.currentThread().getId() +")");
}
}