Я хочу использовать поток, который сортирует список с помощью моего метода быстрой сортировки.

К сожалению, я не знаю, как это сделать.

   ------------------
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?

0
Gaga1231 25 Апр 2016 в 15:45

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 отвечает за раскрутку или повторное использование потоков для вашей краткосрочной асинхронной работы.

0
Berin Loritsch 25 Апр 2016 в 13:00

Вы действительно можете сделать это, только используя поля для хранения данных.

Вы можете легко добиться этого с помощью конструктора;

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 или использование ваших потоков для извлечения данных из коллекций.

0
KookieMonster 25 Апр 2016 в 13:21
    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 должен быть окончательным.

1
David Zimmerman 25 Апр 2016 в 13:23