Семафор и тема - PullRequest
       32

Семафор и тема

0 голосов
/ 22 декабря 2011

После прочтения семафоров я попробовал этот тестовый код, в котором я создаю два потока A и B. Моя цель - позволить потоку A ждать 10 секунд для завершения какой-либо операции в потоке B.Но так как я немного изменил логику в потоке B, введя бесконечный цикл while, который никогда не выходит, поток A также зависает, и программа работает вечно.Кто-нибудь может мне помочь, как достичь цели, которую я ищу?

пакет;

import java.util.concurrent.Semaphore;

public class Concurrency {
    public int count = 0;

  public static void main(String args[]) throws Exception {
    final Semaphore sem = new Semaphore(1, true);
    Thread thrdA, thrdB;
    thrdA = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (sem) {
                try {
                    sem.wait(10000);
                    System.out.println("thread1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    });
    thrdB = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (sem) {
                System.out.println("thread2");

                while(true){

                }
            }

        }
    });

    thrdA.start();
    thrdB.start();

    thrdA.join();
    thrdB.join();

  }
}

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

В вашем коде много проблем.

  1. Как уже упоминалось в комментариях и ответах, вы, если хотите подождать / уведомить, не должны использовать Semaphore.
  2. while(true) увеличивает нагрузку на процессор. Попробуйте использовать Thread.sleep или приобрести семафор / блокировку.
  3. Вам нужно подробнее рассказать о том, чего вы хотите достичь. Если вы хотите, чтобы поток B ожидал поток A, вам не нужен семафор / блокировка. Просто позвоните thread1.join(), прежде чем делать какие-либо другие вызовы в thread2.run.
0 голосов
/ 22 декабря 2011

Glowcoder верен - он работает вечно, потому что ваши потоки не делают ничего полезного.thrdA ожидает семафор, thrdB зацикливается вечно, ничего не делая - он должен что-то делать с семафором в какой-то момент, чтобы thrdA мог преодолеть ожидание.

...