2013-07-07 2 views
0

Вопрос: -Реализация Multiplex (параллелизм) в Java

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

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

мое решение


package multiplex; 

public class Multiplex { 

    private static Multiplex multiplex = new Multiplex(); 
    private volatile static int counter = 0; 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Runnable run = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        multiplex.criticalSection(); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 
     for(int index = 0; index < 100; index++){ 
      Thread thread = new Thread(run); 
      thread.setName("Multiplex"+index); 
      thread.start(); 
     } 

    } 

    public void criticalSection() throws InterruptedException{ 
     System.out.println("counter is" + counter); 
      synchronized (multiplex) { 
        if(counter <=5){ 
        counter++; 
        System.out.println("No Counter is " + counter); 
        Thread.sleep(1000); 
        System.out.println(Thread.currentThread().getName() + "Hello I am critical"); 
        multiplex.notify(); 

       }else{ 
        counter--; 
        System.out.println("Waiting Thread" + Thread.currentThread().getName() + " " + counter); 

        multiplex.wait(); 
       } 

      } 
    } 
} 
+0

использовать семафор или ** пул потоков **, вам бы помогли [здесь] (http://www.codeproject.com/Articles/616109/Java-Thread-Tutorial#sem) –

ответ

3

Решение использовать Semaphore:

// nrPermits is the number of simultaneous semaphore holders 
final Semaphore semaphore = new Semaphore(nrPermits); 

// then: 

semaphore.acquire(); // blocks until a permit is available 
try { 
    criticalSection(); 
} finally { 
    semaphore.release(); 
} 

Другим решением было бы использовать ограниченную ThreadPool и политику ставить задачи на удержание, пул потоков заполнен. Это то, что Executors.newFixedThreadPool() делает по умолчанию:

final ExecutorService service = Executors.newFixedThreadPool(nrTasks); 
// use Runnables or FutureTasks if the threads produce results 
+0

Спасибо. Как подумалось, как это можно сделать в pre Java 5? – ArunM

+0

Uuh ... backport-util-concurrent? : p Честно говоря, это было бы довольно сложно. Я только когда-либо делал многопоточное программирование в Java 5+. Для Java 4 я не буду помогать ... – fge

2

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

Проще простого решения состоит в том, чтобы иметь пул потоков фиксированного размера из 6 и отправлять ему Runnable задачи. Это будет намного более эффективным, но также более простым для записи/чтения.

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