2016-04-08 4 views
1

Я пытаюсь запустить пример потребителя-производителя, который я получил от http://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/explicitlocks.html, код ниже. Когда я запускаю его, он просто запускается два раза и, кажется, висит. Код, кажется, разблокируется и сигнализирует правильно, кто-нибудь знает, чего я не вижу.Явные блокировки и переменные условий Java-производитель Потребитель

static Thread t1; 
static Thread t2; 


public static void main(String[] args){ 
    Lab2 r1=new Lab2(); 
    Lab2 r2=new Lab2(); 


    t1=new Thread(r1, "producer"); 
    t2= new Thread(r2, "consumer"); 
    //System.out.println("Adding"); 

    t1.start(); 
    t2.start(); 

} 



public int get(int who) { 

    aLock.lock(); 
    System.out.println("locked1"); 

    try { 
     while (available == false) { 

      try { 
       System.out.println("false avail waiting"); 

       condVar.await(); 
       System.out.println("false avail waiting done"); 

      } catch (InterruptedException e) { } 
     } 
     available = false; 
     System.out.println("Consumer " + who + " got: " + 
          contents); 
     condVar.signalAll(); 
    } finally { 
     aLock.unlock(); 
     return contents; 
    } 
} 

public void put(int who, int value) { 


       aLock.lock(); 
       System.out.println("locked"); 

try { 
    while (available == true) { 
     System.out.println("true avail"); 
     try { 
      condVar.await(); 
     } catch (InterruptedException e) { } 
    } 
    contents = value; 
    available = true; 
    System.out.println("Producer " + who + " put: " +contents); 
    condVar.signalAll(); 
    //condVar.signal(); 
    } finally { 
     aLock.unlock(); 

    } 
} 


public void run() { 
    //System.out.println(Thread.currentThread().getName()+" Thread started"); 
    int i=0; 
    //System.out.println("Adding"); 

    while(i<10){ 
     i++; 
     //System.out.println(i); 
     if (Thread.currentThread().getName().equals("producer")){ 
     get(2); 
     //producer(); 
     } 
     else{ 
     put(2,1); 
     //consumer(); 
     } 
     //break; 
    } 
} 
+0

Какой код вы используете? Вы отправили два метода, но мы не знаем, как вы их используете. –

+0

Ярослав, спасибо. Я добавил. – user2997606

ответ

1

Ваша проблема здесь:

Lab2 r1=new Lab2(); 
Lab2 r2=new Lab2(); 

t1=new Thread(r1, "producer"); 
t2= new Thread(r2, "consumer"); 

Т.е. у вас есть два потока, выполняющих независимые runnables (r1, r2), но они должны быть снабжены одним и тем же runnable.

Замените его:

Lab2 r=new Lab2(); 

t1=new Thread(r, "producer"); 
t2= new Thread(r, "consumer"); 
+0

Спасибо! Ты спас меня хотя бы на час. – user2997606