2016-11-25 2 views
0

Я пишу приложение для Android. В основном потоке можно определить методы, а затем вызвать методы, которые помогают сохранить код в чистоте. В новом потоке, как определить методы, чтобы избежать написания всего кода в «одном блоке»? Можно ли вызвать методы, определенные в основном потоке, или вы можете каким-то образом определить их внутри нового потока? Так быть ясно, что я хочу сделать это:Как создать методы для потока?

volatile Runnable feedToBuffer = new Runnable() 
     { 
      @Override 
      public synchronized void run() 
{ 
    if(boolean) 
    { 
    MethodA(); 
    } 
    else 
    { 
    MethodB(); 
    } 
} 

и не так:

volatile Runnable feedToBuffer = new Runnable() 
      { 
       @Override 
       public synchronized void run() 
    { 
     if(boolean) 
     { 
     //Code that was in MethodA 
     } 
     else 
     { 
     //Code that was in MethodB 
     } 
    } 
} 

Возможно ли это? Я понимаю, что эта информация, вероятно, где-то там, но не нашла ее, поэтому очень благодарна за любую помощь. :)

+1

Да, конечно, это возможно. Метод 'run' является обычным методом, он также может вызывать другие методы. – Thilo

+2

Просто определил эти методы после запуска() ... 'new Runnable() {/ * здесь я могу создать все методы, которые я хочу * /}' – AxelH

+3

Странно иметь метод 'synchronized' run. Почему вы это добавили? – Thilo

ответ

1

Это вполне возможно. Поток - это всего лишь последовательность действий, и если он включает вызов метода, он будет выполнен в этой последовательности. Это не имеет значения.

Нити никоим образом не привязаны к структуре вашего кода. Основное различие между нитями, которые вы запускаете, и тем, которое вы уже начали при запуске приложения, - это точки входа. Когда Android запускает основной поток, он входит в ваше приложение во многих точках, в действии, которое было бы вызовом жизненного цикла, например, onCreate() или нажатием кнопки для прослушивания. Когда вы создаете новый поток, ваша точка входа - это метод run, из которого вы можете вызывать все, что хотите.

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

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

+0

Так что в принципе, я могу вызвать метод из main, пока я не пытаюсь это сделать, прежде чем он успел определиться или в то же время раз другой поток пытается его использовать? Это хорошо знать, я пойду с определением методов в потоке отдельно для этого случая, поскольку он кажется самым безопасным, но будет проверять на синхронизацию - кажется важным. :) – gnyrfta

+1

@gnyrfta Вы можете вызывать те же методы одновременно, если они ничего не изменяют. Если это так, то вам нужно знать о синхронизации для написания правильных программ. Я передам вам [учебники по параллелизму Oracle] (https://docs.oracle.ком/JavaSE/учебник/важно/параллелизм/index.html). Вам действительно нужно их прочитать, иначе вы, вероятно, напишите неправильный код, который может работать отлично в большинстве случаев, но затем неожиданно сбой. Для чего-то более продвинутого я советую вам прочитать Java Concurrency на практике, это очень полезная книга. – Malcolm

+0

Спасибо! Я посмотрю на это. – gnyrfta

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