Как отмечают другие, вы не ждете, пока ваши потоки завершат выполнение.Вы должны следовать советам @Howard и @JK, и это решит вашу основную проблему.Если вы решите сделать больше с потоками и параллельной обработкой, я бы настоятельно рекомендовал изучить пакеты java.util.concurrent - в них есть много полезных классов, которые значительно облегчат вашу жизнь.
Я позволил себе перекодировать ваш пример, используя Callable и ExecutorService.Посмотрите пример кода ниже:
public static void main(String[] args) {
int size = 10;
int n_threads = 2;
float tab[] = new float[size];
for (int i = 0; i < size; i++) {
tab[i] = i;
}
System.out.println(Thread.currentThread());
for (int i = 0; i < size; i++) {
System.out.println(tab[i]);
}
// Determine batch size, based off of number of available
// threads.
int batchSize = (int) Math.ceil((double) size / n_threads);
System.out.println("Size: " + size + " Num threads: " + n_threads
+ " Batch Size: " + batchSize);
// Create list of tasks to run
List<Callable<Object>> tasks = new ArrayList<Callable<Object>>(
n_threads);
for (int i = 0; i < n_threads; i++) {
tasks.add(Executors.callable(new MyRunnable(i * batchSize,
((i + 1) * batchSize) - 1, tab)));
}
// Create an executor service to handle processing tasks
ExecutorService execService = Executors.newFixedThreadPool(n_threads);
try {
execService.invokeAll(tasks);
} catch (InterruptedException ie) {
ie.printStackTrace();
} finally {
execService.shutdown();
}
for (int i = 0; i < size; i++) {
System.out.println(tab[i]);
}
}
И внес одно небольшое изменение в ваш класс MyRunnable, который пропускал обработку по последнему индексу:
@Override
public void run() {
System.out.println(Thread.currentThread());
for (int i = startIndex; i <= endIndex; i++) {
tab[i] = i * 2;
}
System.out.println("Finished");
}
Отлично работает, вы можете протестироватьдля себя.Существует множество других классов в java.util.concurrent, которые могут выполнять аналогичные функции, не стесняйтесь исследовать.
Удачи!