2016-04-18 6 views
0

У меня вопрос. Я только начал использовать Threads и im довольно хромой на нем. Iam работает над некоторой задачей.Выполняемые темы в определенном порядке

Предположим, у меня есть 3 темы. Основная задача каждого потока - записать 1 строку из .txt и так далее в конец файла. Мне удалось это сделать, но я не знаю, как использовать функции wait() и notify(). Моя программа работает так:

t1 writes line 
t2 writes line 
t1 writes line 
t2 writes line 
t3 writes line 
t2 
t1 
t2 
t3 
t2 
t1 ... 

когда я синхронизирован моя тема с помощью какого-то объекта. В каждом новом методе Thread run() я набрал также метод notifyAll() и wait(). Но это доцент, как и должно быть:

t1 
t2 
t3 
t1 
t2 
t3 
... 

Любые советы ребята? Я был бы благодарен.

tldr: Как уведомить t2 для запуска после t1 и t3 после t2 и t1 после t3 и так далее?

+0

Отправьте свой код. – shmosel

+3

То, как вы пытаетесь синхронизировать свои потоки, нарушает значение потоковой передачи, которое должно выполнять несколько заданий асинхронно. – ControlAltDel

ответ

1

Простейший решение, используя только класс Автор:

thread1.start(); 
thread1.join(); 
thread2.start(); 
thread2.join(); 
thread3.start(); 
thread3.join(); 

Но это действительно помогает? Зачем создавать их в виде потоков, если вы хотите последовательно их запускать?

+0

Этот способ убивает мои потоки, и я не хочу этого делать. Они должны работать в фоновом режиме и ждать своей очереди. – iboan

+1

Или просто 'thread1.run(); thread2.run(); thread3.run(); ';) + 1 –

0

Они должны работать в фоновом режиме и ждать своей очереди.

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

Как уведомить t2 для запуска после t1 и t3 после t2 и t1 после t3 и так далее?

new Thread(() -> { 
    thread1.run(); 
    thread2.run(); 
    thread3.run(); 
}).start(); 

Это выполняет задачи в фоновом режиме, по одному за раз.

+0

Они работают, но в случайном порядке. Как уведомить exacly t2, чтобы иметь доступ к данным, которые используют другие потоки? – iboan

+0

@iboan Я бы передал объект Context, который имеет всю информацию, необходимую каждому потоку, это может быть передано каждому потоку/задаче, чтобы они могли видеть данные друг друга. –

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