2013-09-04 7 views
0

Теперь я изучаю концепции многопоточности. Я могу запустить один поток с помощью обработчика и Runnable(). Я хочу, чтобы мой код запускал два потока, например Thread1 запускает метод1(), а thread2 запускает метод2(). Thread1 должен работать в течение 2 секунд, а затем спать в течение 1 секунды. В то же время thread2 должен пробуждаться и работать в течение 1 секунды. Опять же, thread1 должен работать в течение 2секунд. Этот процесс должен выполняться непрерывно. Я делаю это в Android.Концепция многопоточности

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

+0

Использование таймера и TimerTask для достижения этой цели –

+0

Как я могу это сделать? Любой пример кода, пожалуйста. – nki

+0

Не имеет двух потоков, которые спят в альтернативные моменты, кажется, побеждает точку с двумя потоками? Возможно, вы получите ответ, более похожий на потоки, если вы дадите пример того, что должен делать каждый поток. –

ответ

2

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

//creates a thread pool of size 2 
int poolSize = 2; 
// creates ScheduledThreadPoolExecutor object with number of thread 2 
ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(poolSize); 

//starts executing after 1 second 
ScheduledFuture<Callable-Type> sf = stpe.schedule(new TaskOne(), 1,TimeUnit.SECONDS); 

//starts executing after 2 seconds 
ScheduledFuture<Callable-Type> sf1 = stpe.schedule(new TaskTwo(), 2,TimeUnit.SECONDS); 

И вы можете определить свои задачи, как показано ниже:

class TaskOne implements Callable<Callable-Type> { 
    @Override 
    public Callable-Type call() throws Exception { 
     //DO YOUR WORK HERE 
     return callable-type; 
    } 
} 

class TaskTwo implements Callable<Callable-Type> { 
     @Override 
     public Callable-Type call() throws Exception { 
      //DO YOUR WORK HERE 
      return callable-type; 
     } 
    } 

Преимущества использования ScheduledThreadPoolExecutor над Timer являются: создает

  • Таймер только один поток для выполнения задач таймера. Запланированные пулы потоков направляют это ограничение, предоставляя вам несколько потоков для выполнения отложенных и периодических задач.
  • Еще одна проблема с таймером заключается в том, что он плохо себя ведет, если TimerTask выдает исключение. Нить Timer не вызывает исключения, поэтому исключенное исключение из TimerTask завершает поток таймера.

Ref: Java Параллелизм на практике

+0

Спасибо @Debojit Saikia, за ваш ответ и извините за мой поздний ответ. У меня есть сомнения, что оба потока, которые я хочу запустить, - это потоки пользовательского интерфейса, реализующие слайд-шоу изображений. Я хочу использовать методы sleep(), notify() для этого. Не могли бы вы объяснить мне, как ваш код относится к этой проблеме? – nki

+0

@nki Оба потока (T1, T2) будут работать на одном и том же объекте (O1), так что любой из них (предположим, что T1) может ожидать, пока определенное условие станет истинным. И когда другой поток (T2) вызывает 'notifyAll' после изменения состояния объекта, ожидающий поток (T1) должен проснуться и начать работать - это ваше требование? Извините, я запутался в этом вопросе. –

+0

, когда t1 работает в течение 2 секунд, а затем спит в течение 1 секунды. t2 работает в этом среднем значении времени, t2 работает в течение 1 секунды и спит в течение 2 секунд. это то, что связано с концепцией параллелизма. – nki

2

Образец

Timer timer = new Timer(); 
        timer.schedule(new TimerTask() { 

         @Override 
         public void run() { 
          runOnUiThread(new Runnable() { 

           @Override 
           public void run() { 
            //your code 
           } 
          }); 
         } 
        }, 2000, 1000); // 2000 is delay and 1000 is call period 

Существует также другой график() методы, которые вы можете использовать, чтобы сопоставить критерии.

0

у вас есть использование ниже двух механизаторов.

Wait and Notify methods 
Смежные вопросы