Я хочу использовать поток, который сортирует список с помощью моего метода быстрой сортировки.
К сожалению, я не знаю, как это сделать.
------------------
blabla other Methodes that quicksort/ sort needs....
------------------
public static void sort(int[] list) {
quickSort(list, 0, (list.length-1)); // <--- I want use this in a Thread
}
public static void main (String[] args) {
int[] newList = {5, 7, 23, 87, 11, 0, 5, 33, 30,512, 125, 215 ,7, 234, 152, 125};
for(int i: newList) {
System.out.print(i + " ");
}
System.out.println();
sort(newList); // <--- OR I want use this in a Thread
Моя проблема в том, что я не знаю, как использовать метод с параметрами в потоке.
Кто-нибудь знает хороший учебник, в котором объясняется, как это сделать?
Что лучше реализовать Runnable или расширяет Thread?
3 ответа
У вас есть один базовый подход и пара реализаций. Базовый подход - расширить базовый класс и передать свой параметр конструктору. Сохраните этот параметр в поле final
, а затем получите к нему доступ из вашего метода run()
. Пример:
public class QuickSort extends Thread {
final int[] entries;
public QuickSort(int[] list) {
entries = list;
}
public void run() {
// do your quick sort.
// the final int[] entries just keeps the list from being
// replaced at run time, the entries themselves are not frozen.
}
}
Чтобы использовать поток, вы должны выполнить его следующим образом:
QuikSort qs = new QuickSort(myList);
qs.start();
// When you need to wait for the sort to be done:
// Don't try to use the list before hand because it's
// state will be undefined.
qs.join();
Проблема в том, что мы сжигаем целую ветку в течение относительно короткого времени. Потоки - дорогие ресурсы операционной системы, и их очистка может занять некоторое время. Лучше повторно использовать потоки. К счастью, Executor
Система была создана, чтобы упростить эту задачу (я помню, как создавал ее во фреймворке задолго до того, как это стало доступно).
Стратегия завершения фактически та же, за исключением того, что ваш Executor
отвечает за раскрутку или повторное использование потоков для вашей краткосрочной асинхронной работы.
Вы действительно можете сделать это, только используя поля для хранения данных.
Вы можете легко добиться этого с помощью конструктора;
public Worker extends Thread
{
Object data1, data2, //...
public Worker(Object data0, Object data1, ...)
{
//set the fields
}
public void run()
{
//do stuff using the fields we set
}
}
Теперь передать потоку правильные данные; new Worker(data1, data2, ...).start();
Но создание потока очень дорого, и вы хотите, чтобы каждый поток выполнял как можно больше. Например, если вам нужно было запускать этот метод значительное количество раз, то более подходящей будет среда Executor или использование ваших потоков для извлечения данных из коллекций.
final int[] newList = {5, 7, 23, 87, 11, 0, 5, 33, 30,512, 125, 215 ,7, 234, 152, 125};
System.out.println();
thread t = new Thread () {
public void run () {
sort(newList);
}
};
t.start();
Обратите внимание, что newList должен быть окончательным.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.