Вопрос

Я запутался на следующем:
Чтобы использовать потоки в программе Java, самый простой способ - расширить класс потоков и реализовать интерфейс Runnable (или просто внедрить Runnable).
Чтобы начать выполнение потока. Мы должны вызвать настройку метода потока (), который в поворотах вызовов метод работает () потока. И поэтому нить начинается.
Старт метода () (если я не ошибаюсь) нужно называться точно и только один раз для каждого потока. В результате экземпляры потоков не могут быть повторно использованы, если каким-то образом сам метод выполнения не работает в некоторой короткой из бесконечной петли, который облегчает пользовательскую реализацию ReWage Thread.
Теперь Javadoc.Ссылка текстаговорит

Вызывы для выполнения будут повторно использовать ранее построенные потоки, если они доступны

Я не понимаю, как это реализовано. Я предоставляю в методе выполнения метода Исполнителя, мой пользовательский поток, например,

  ExecutorService myCachedPool = Executors.newCachedThreadPool();
  myCachedPool.execute(new Runnable(){public void run(){  
     //do something time consuming

  }});

Как эта пользовательская нить может повторно использовать эту пользовательскую нитью для этой структуры исполнителя?
Исполнитель разрешен для вызова метода Start () более 1 раз, пока мы не можем в наших программах? Я что-то не понимаю?

Спасибо.

Это было полезно?

Решение

Обратите внимание, что это не Executor что звонит start() - это ExecutorService. Отказ И нет, это не звонит start() дважды. Это не запускает задачу, которую вы даете ему напрямую, используя Thread.start()... вместо этого начнется нить, которая знает о том, что очередь пула пула. Нить будет в основном подождать, пока не будет работать некоторая работа, то выберите его и выполните его, прежде чем вернуться к ожиданию. Так что хотя нить выполняет несколько задач, Thread.start() называется только один раз.

Редактировать: судя по комментариям, вы немного запутались в разнице между Runnable (что является задачей, которая должна быть выполнена) и Thread (который является то, что выполняет задачи).

Та же тема может выполняться несколько задач. Для очень простого примера не используя пул резьбы, рассмотрите это:

public class MultiRunnable implements Runnable
{
    private final List<Runnable> runnables;

    public MultiRunnable(List<Runnable> runnables)
    {
        this.runnables = runnables;
    }

    public void run()
    {
        for (Runnable runnable : runnables)
        {
             runnable.run();
        }
    }
}

(Игнорируйте потенциальные вопросы безопасности потоков List<T> из нескольких нитей.)

Вы могли бы создать целую кучу Runnable Задачи, способные делать разные вещи, то создать один MultiRunnable Чтобы запустить их в свою очередь. Пройти этот экземпляр MultiRunnable в Thread Конструктор, а затем, когда вы запускаете нить, он выполнит каждую из исходных рабочих задач. Это помогает?

Другие советы

Это не вызывает начать () более одного раза; Вместо этого нить в бассейне никогда не завершается, но просто остается в живых --- жду. Исходный код доступен для загрузки, если вы хотите посмотреть на него.

Каждая нить в пуле резьбы может просто wait() Для исполнителя, чтобы передать его новую прогонзуру, но собственная нить run() Метод не завершен. Это просто ждет нового проводимого исполнителя для исполнителя.

Чтобы «начать» нить более одного раза, создайте Runnable. Например:

//NO
private class T extends Thread { //not necessary to implement runnable
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    a.start();
    a.start(); //NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO
}

Вместо,

//Yes
private class T implements Runnable {
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    new Thread(a).start();
    new Thread(a).start(); //YES YES YES
}

Также возможно сделать это:

void someMethod(){
    final Runnable r = new Runnable(){
        public void run(){
            //...
        }
    };
    new Thread(r).start();
    new Thread(r).start();
}
// r could also be a field of you class. 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top