2013-12-05 2 views
3

Обновление: Спасибо всем! Я изменил программу в соответствии с предложениями, а приведенный ниже код - это модифицированный код.Резьба начинает работать и оканчивается


Оригинал публикации: Я прошел через какой-то типа «Применить и анализ» вопросов и в одном вопросе, программист было предложено применить многопоточности концепцию трех счетчиков бронирования в кинотеатре и рассчитать общие номера бронирования и сумму, собранную в шоу.

И я написал программу для того же, который вы можете увидеть ниже:

import java.io.*; 
import java.lang.*; 

class Cinema 
{ 
    int no=0,price=0; 
    synchronized void reservation(int n,int p) 
    { 
     no=no+n; 
     price=price+p; 
    } 
} 


class Counter implements Runnable 
{ 
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
    Cinema c; 
    int not,cost; 
    Counter(Cinema c) 
    { 
     this.c=c; 
    } 
    public void run() 
    { 
     try 
     { 
      System.out.print("\nCounter 1"); 
      System.out.print("\nEnter the no. of tickets :"); 
      not=Integer.parseInt(br.readLine()); 
      cost=not*150; 
      c.reservation(not,cost); 
     } 
     catch(IOException e){System.out.print("\n"+e);} 
    } 
} 

class CinemaMain 
{ 
    public static void main(String args[])throws IOException 
    { 
     Cinema c=new Cinema(); 
     System.out.print("\nCounter 1"); 
     Thread c1=new Thread(new Counter(c)); 
     c1.start(); 
     c1.join(); 
     System.out.print("\nCounter 2"); 
     Thread c2=new Thread(new Counter(c)); 
     c2.start(); 
     c2.join(); 
     System.out.print("\nCounter 3"); 
     Thread c3=new Thread(new Counter(c)); 
     c3.start(); 
     c3.join(); 
     try 
     { 
      Thread.sleep(500); 
     } 
     catch(InterruptedException ie) 
     { 
      System.out.print("\n"+ie); 
     } 
     System.out.print("\nTotal no. of tickets :"+c.no); 
     System.out.print("\nTotal Money collected:"+c.price); 
    } 
} 

я могу скомпилировать это просто отлично, но когда я запускаю программу, это то, что я получаю ->LINK (так как у меня нет 10 репутации, я не мог опубликовать изображение здесь, извините!) Я не знаю, почему, он не просит ввода, даже если я написал код, чтобы получить ввод в перспективе метод.

+0

Рассмотрите возможность использования «Сканера» для ввода в консоль. –

+0

Зачем вам 3 Темы? – Chriss

+4

Что это за безумие? Почему у вас нет одного класса Counter с тремя экземплярами? – dimoniy

ответ

5

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

Есть несколько вещей неправильно с вашей программой:

  1. Основная нить не ждет, пока закончится нить Counter, прежде чем она распечатает итоги. Если вам нужно дождаться завершения потока, вы вызываете на него thread.join().

    Thread counter1 = new Thread(new Counter1(c)); 
    counter1.start(); 
    // start other threads here... 
    // now wait for the counter1 to finish 
    counter1.join(); 
    

    В вашем случае, 3 Counter s раздваиваются, но главное спит только немного, а затем завершает работу. Потоки Counter все еще запущены.

  2. Каждый из Counter нитей добавления значения полей внутри Cinema, но нет синхронизации в Cinema. В любое время, когда два потока изменяют одно и то же поле, должна быть какая-то защита мьютекса и синхронизация памяти.

    Проще всего сделать здесь Cinema.reservation(...) метод synchronized. Затем каждый из объектов Counter получит блокировку на экземпляре Cinema, который обеспечит только одно обновление Counter: Cinema. Ключевое слово synchronized также гарантирует, что поля в объекте Cinema также синхронизируются с памятью.

    synchronized void reservation(int n,int p) { ... 
    
  3. Как всегда, вы должны рассмотреть возможность использования ExecutorService классов вместо разветвления тему с себя. См. Java tutorial.

+0

Kudos ... Действительно полезно! Поскольку я новичок в Java, все эти потоки и концепция апплета немного сложны для меня, но такие парни, как вы, очень полезны и еще раз благодарны за ваши объяснения :) –

0

Зачем вам создавать темы, когда вы можете просто сделать это проще?

import java.io.*; 
import java.lang.*; 
import java.util.Scanner; 

public class Cinema { 

    public Cinema(){ 

int no=0,price=0; 


} 

public int Count() { 



int not,not2, not3, cost,cost2,cost3; 




     System.out.print("\nCounter 1"); 
     System.out.print("\nEnter the no. of tickets: "); 
     Scanner br=new Scanner(System.in); 
     String input=br.nextLine(); 
     not=Integer.parseInt(input); 
     cost=not*150; 

     System.out.println("Cost of tickets: "+cost); 


     System.out.print("\nCounter 2"); 
     System.out.print("\nEnter the no. of tickets: "); 
     Scanner br2=new Scanner(System.in); 
     String input2=br2.nextLine(); 
     not2=Integer.parseInt(input2); 
     cost2=not2*150; 

     System.out.println("Cost of tickets: "+cost2); 


     System.out.print("\nCounter 3"); 
     System.out.print("\nEnter the no. of tickets: "); 
     Scanner br3=new Scanner(System.in); 
     String input3=br3.nextLine(); 
     not3=Integer.parseInt(input3); 
     cost3=not3*150; 

     System.out.println("Cost of tickets: "+cost3); 

     int total=cost+cost2+cost3; 
     int tickets=not+not2+not3; 
     System.out.println("Total price for tickets is: "+total); 
     System.out.println("Total number of tickets is: "+tickets); 
     return total; 


} 



public static void main(String args[]) 
{ 
    Cinema c=new Cinema(); 
    c.Count(); 


    } 





} 
1

Попробуйте этот подход;

import java.io.*; 
import java.lang.*; 

public class Cinema 
{ 
    int no=0,price=0; 
    synchronized void reservation(int n,int p) 
    { 
     no=no+n; 
     price=price+p; 
    } 

    public static void main(String args[])throws IOException, InterruptedException 
    { 
     Cinema c=new Cinema(); 
     Thread t1 = new Thread(new Counter(c,"Counter 1")); 
     t1.start(); 
     Thread t2 = new Thread(new Counter(c,"Counter 2")); 
     t2.start(); 
     Thread t3 = new Thread(new Counter(c,"Counter 3")); 
     t3.start(); 

     t1.join(); 
     t2.join(); 
     t3.join(); 
     try 
     { 
      Thread.sleep(100); 
     } 
     catch(InterruptedException ie) 
     { 
      System.out.print("\n"+ie); 
     } 
     System.out.print("\nTotal no. of tickets :"+c.no); 
     System.out.print("\nTotal Money collected:"+c.price); 
    } 
} 


class Counter implements Runnable 
{ 
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
    Cinema c; 
    int not,cost; 
    String counterName; 
    Counter(Cinema c,String counterName) 
    { 
     this.c=c; 
     this.counterName=counterName; 
    } 
    public void run() 
    { 
     try 
     { 
      synchronized(c) { 
      System.out.print("\n" + counterName); 
      System.out.print("\nEnter the no. of tickets :"); 
      not=Integer.parseInt(br.readLine()); 
      cost=not*150; 
      c.reservation(not,cost); 
      } 
     } 
     catch(IOException e){System.out.print("\n"+e);} 
    } 
} 
  1. Я сделал один класс Счетчик вместо 3-х классов, которые вы используете.

  2. Я сделал способ резервирования для синхронизации.

  3. Я назвал метод join для всех трех потоков. Таким образом, программа не прекратится внезапно. Последняя ветвь, которая была бы главной, была бы главной.

  4. В режиме run() я заблокировал объект Cinema c. Это решит вашу проблему Buffered Reader в этот момент времени. Но в сценарии реального мира разные потоки будут выполняться разными людьми. Поэтому нет необходимости блокировать объект Cinema. Это просто для вашего использования.

+1

Спасибо! Но я уже обновил его. В любом случае, еще раз спасибо за попытку помочь мне! :) –

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