2013-08-07 2 views
1

Как настроить справедливость между заданными k потоками для генерации некоторого результата?
Другими словами, представьте, что у нас есть k нитей, которые печатают «1» и «нить» «2».
Теперь, как мы можем установить справедливость между потоками, чтобы каждый поток печатал (например, «1») столько же, сколько и другой (k - 1) отпечаток (например, «1») и тот же для n-ниточной печати «2».Откорректируйте справедливость в многопоточности

+0

Я думаю, что я должен обработать его с помощью метода ожидания и уведомления, но я не знаю, как это сделать? – user2625638

ответ

0

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

public class MyThread extends Thread 
{ 
    int number = 0; 
    public MyThread(int number) { 
     this.number = number; 
    } 

    @Override 
    public void run() 
    { 
     while(true) { 
     System.out.println(this.number); 
     this.sleep(1000);//control exception 
     } 
    } 

} 

затем в главном

public class Main() { 
    public static void main(String[] args) { 
     int k = 10 
     for(int i = 0; i < k; k++) { 
      MyThread mt = new MyThread(1); 
      mt.start(); 
      mt.join(); 
     } 
    } 
} 

Вы должны повторить подобную форму для печати Тема 2

1

Перед созданием темы, создать массив [0..numThreads -1] пустых семафоров, по одному для каждого потока, который вы собираетесь создать. Сигнал к каждому потоку при его создании увеличивает индекс семафора, 0..numThreads-1.

В функции потока подождите его семафор [index], затем напечатайте что-нибудь, затем сообщите семафор [(index + 1) mod numThreads], затем зациклируйте, чтобы снова ждать семафора [index].

Как только вы это сделали, ничего не должно произойти вообще.

Бросьте в один блок семафора, где угодно.

+0

может объяснить вам немного больше об этом? – user2625638

+0

Это эссенциально пропускает «токен печати» вокруг потоков. Когда нить печатала что-то, она передает токен следующему, и это продолжается круговым способом. –

+0

Я просто хочу знать, где ждать() и где уведомлять поток об этом. – user2625638

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