2015-08-13 11 views
2

Узнав о многопоточности в android, я запутался, как несколько потоков, фактически выполняемых в процессоре. Я знаю, что в целом процессор (одноядерный) использует алгоритм round robin для запуска различных процессов, дающих иллюзию обработки parellel, но как процессор управляет несколькими потоками в рамках одного процесса.

Я читал, что при разработке приложений для android мы должны делать всю ресурсоемкую работу из потока main/ui, чтобы ui не реагировал на запросы при выполнении интенсивной работы.
BUT
«Поскольку одноядерный процессор может выполнять только один поток за раз », поэтому всякий раз, когда процессор занят рабочим потоком, он может не запускать нить ui, поэтому в течение этой фазы не будет отвечать на запросы ui, поскольку cpu занят рабочим потоком.
Значит, помогает многопоточность?
Мне нужно концептуальное объяснение этого, возможно, с помощью примера.

************************* EDIT ********************* *********
Что происходит, когда пользователь пытается взаимодействовать с ui, пока рабочий поток работает (я знаю, что это редко возможно, так как все это происходит за миллисекунды, но все равно, что произойдет) ?Как работает несколько потоков на одноядерном процессоре

+1

возможный дубликат [Trouble Понимание CPU Планирование Concepts] (HTTP: //stackoverflow.com/questions/22084093/trouble-understanding-cpu-scheduling-concepts) – Im0rtality

+2

Возможно, вам будет полезно https://communities.intel.com/message/156694 и http://superuser.com/questions/ 269634/multitasking-illusion-on-a-one-threaded-processor – Rohit5k2

+2

* «Я знаю, что в целом процессор (одноядерный) использует алгоритм round robin для запуска различных процессов, дающих иллюзию обработки parellel, но как управлять процессором несколько потоков в рамках одного процесса »* Точно так же. – m0skit0

ответ

1

одноядерный процессор действительно будет выполнять только один поток одновременно. Процессор будет переключаться между потоками много раз в секунду (в данном процессе), поэтому, даже если одновременно выполняются несколько потоков, им будет предоставлена ​​возможность запускать несколько раз в течение нескольких миллисекунд в секунду.

Детали будут зависеть от планирования потока и приоритета потока.

Что блокирует поток пользовательского интерфейса, совершенно не относящийся к архитектуре процессора. Запуск длинной задачи в потоке пользовательского интерфейса может блокировать выполнение потока (потому что процессор будет ждать события, чтобы перезапустить выполнение потока).

EDIT Если пользователь взаимодействует с UI, а поток пользовательского интерфейса не работает, интерфейс будет отвечать на запросы. Но действия помещаются в очередь в очереди Thread. Это означает, что даже если поток не сможет обрабатывать действия пользовательского интерфейса в какой-то момент, он все равно будет выполнять эти задачи позже. Конечно, есть определенный предел.

Если вы планируете выполнять множество задач, вы все равно должны пойти на threads pool.

EDIT2

В качестве примера рассмотрим очень простую активность, с большой кнопкой, которая знает много о себе:

public class MainActivity extends ActionBarActivity { 

    int counter = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Button b = new Button(this); 
     b.setText("Click me. I'll make the thread sleep for one second. Then I'll notify you in the logcat when I'm done sleeping. Afterwards, the thread will execute the next task."); 
     setContentView(b); 
     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       counter++; 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       Log.d("COUNTER", Integer.toString(counter)); 
      } 
     }); 
    } 
} 

Если нажать эту кнопку несколько раз, вы будете см. в сообщениях Logcat, которые печатаются каждую секунду. Это будет продолжаться до тех пор, пока очередь нитей не будет пустой, что означает, что для каждого щелчка был вызван onClick.

Таким образом, даже если поток UI не работает, то очередь будет еще получить UI события, и вы будете иметь возможность обрабатывать их позже;)

+0

Итак, пока рабочий поток работает (даже в течение 100 м сек), тогда в течение этого времени поток ui будет заблокирован? –

+1

Да.Но я очень сомневаюсь, что поток пользовательского интерфейса будет блокироваться так долго. По умолчанию пользовательский интерфейс имеет более высокий приоритет, чем фоновый поток. http://www.androiddesignpatterns.com/2014/01/thread-scheduling-in-android.html – Gordak

+0

Я отредактировал свой ответ, чтобы дать вам еще несколько деталей. – Gordak

2

В однопроцессорной системе несколько потоков выполняются один за другим или до тех пор, пока один поток не завершится или не будет остановлен ОС, в зависимости от приоритета потока и политики ОС. Но запущенные потоки создают иллюзию что они работают одновременно, относительно требуемого времени отклика приложения приложения пространства пользователя.

Ссылка: Can multithreading be implemented on a single processor system?

+0

Итак, пока рабочий поток работает (даже на 100 м сек), тогда в течение этого времени будет получен поток ui заблокирован? –

+1

проверить это http://stackoverflow.com/questions/7641164/android-threading-with-single-core – codevscolor

+0

И последний вопрос, который устранит все мои сомнения. «Предположим, что мы находимся в начале 90-х, когда cpu weren ' достаточно сильного ». Предположим, что у нас очень медленный процессор (требуется 3 секунды для выполнения инструкции). Если я запустил ту же программу на этом процессоре, то как бы он себя ведет. Будет ли она работать так, как будто« ui заблокирован для 3 сек, тогда рабочий поток блокируется в течение 3 секунд и т. Д.? –

Смежные вопросы