2013-05-25 56 views
0

我編碼一個小遊戲,其目標是管理一個商場。我的問題是動畫。線程java - 可以重新初始化嗎?

實際上,我的同事創建了類Animateur,它擴展了Thread並實現了Runnable

在我的框架中,我聲明並初始化這個類,然後按下一個按鈕,我需要他的run()執行。

動畫由來自購物中心一側的人組成,買東西離開另一邊。

要開始,我需要調用run()方法。

推後的第一天,一切都是完美的:我看到人和所有人。但是,當我第二次按下同一個按鈕,開始新的一天時,任何工作都會發生,我會陷入困境。 我無法玩,因爲我無法開始新的一天 - 再次執行Animateur課程中的run()

有人可以幫我或給我一些想法來解決這個問題嗎? :(

package myMall; 

import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JOptionPane; 

    public class Animateur extends Thread implements Runnable { 

     private int giorno = 1; 
     private int giornoAttuale=1; 
     private int delay = 30; 
     private int nbVisiteurs =0; 
     private int k=0; 
     private double gainmoyen; 
     public MonMall m; 
     public List<Integer> w = new ArrayList<Integer>(); 
     public List<Integer> e = new ArrayList<Integer>(); 
     public int [] r = new int[6]; 

     public Animateur(MonMall k) { 
      this.m = k; 
      m.setGainmoyen((int)this.gainmoyen); 
      m.setVisitestructure(this.r); 
     } 

     public void setAvance(){ 
      this.giornoAttuale++; 
     } 

     public void run() { 

      while (m.isSimulation()) { 
       if(giorno<=giornoAttuale){ 
       k = k + 30; 
       if (k < 10000) { 
        Client c = new Client(1000, 0, 0, 0); 
        m.listeTemps.add(k); 
        if (m.GenereClient(0.05)) { 
         m.Clients.add(c); 
         m.ajouterVisiteur(c); 
         //System.out.println(entreesec(c)); 
         m.destination.add(m.entreesec(c)); 
         nbVisiteurs++; 
         m.listeVisiteursentres.add(nbVisiteurs); 
        }else{w.add(nbVisiteurs);} 
       } 

       for (int i = 0; i < m.Clients.size(); i++) { //generaliser a Visiteurs 
        Client a = m.Clients.get(i); 
        a.move(); 
        //System.out.println(m.getBudget()); 
        if ((a.getLigne() == 10) && (a.getColonne() == 18)) { 
         m.Clients.remove(i); 
         m.Visiteurs.remove(a); 
        } 
        if (!m.destination.isEmpty()) { 
         Element b = m.destination.get(i); 
         if (a.getLigne() == b.getLigne() && a.getColonne() == b.getColonne() - 1) { 
          b.entreereelle(a); 
          m.setBudget(m.getBudget() + b.getGain()); 
          this.gainmoyen+=m.getBudget(); 
          //b.sortie(a);//una estructura nunca se llena 
          //System.out.println(m.getBudget()); 
         } else if (a.getLigne() == b.getLigne() && a.getColonne() == b.getColonne() + 1) { 
          b.entreereelle(a); 
          m.setBudget(m.getBudget() + b.getGain()); 
          //b.sortie(a); 
          //System.out.println(m.getBudget()); 
         } 
        } 
       } 
       if (m.Clients.isEmpty() && k > 12000) {// Pb con el numer o de clientes entrados pero solucionable 
        m.setSimulation(false); 
        //m.setListeTemps(e); 
        //m.setListeVisiteursentres(w); 
        this.e= m.listeTemps; 
        this.w= m.listeVisiteursentres; 
        this.gainmoyen=this.gainmoyen/this.nbVisiteurs; 
        for(Element e: m.destination){ 
         if(e instanceof Clinique){ 
          r[0]++; 
         }else if (e instanceof CommerceGeneral){ 
          r[1]++; 
         }else if (e instanceof CommerceSpecifique){ 
          r[2]++; 
         }else if (e instanceof Fun){ 
          r[3]++; 
         }else if (e instanceof Restauration){ 
          r[4]++; 
         }else if (e instanceof Gym){ 
          r[5]++; 
         } 
        } 
        System.out.println(m.isSimulation()); 
        (new JOptionPane()).showMessageDialog(null, "Journee finie", "Fin!", JOptionPane.INFORMATION_MESSAGE); 

       try { 

        Thread.sleep(this.delay); 
        }catch (InterruptedException e) { 
       } 
       } 
      //m.notifyFin(); //NO FUNCIONA¿? 
      } 
      giorno++; 
     } 
    } 
} 

我試圖摧毀創建的線程並初始化在點擊一個新的,但奧斯卡最佳噸工作

編輯:

謝謝你的answer要使用執行者服務,我只需要實現這個類代替Runnable

+1

一旦執行'Thread'就不應該重新運行,而應該創建一個新的'Thread'對象並運行它。 –

+0

我們認識到代碼的相關部分(除非你希望我們開始猜測:))。 – gkalpak

回答

4

不擴展線程,而是使用ExecutorService。你可以提交任意數量的Runnables給它任何n次數。對於例子

Java Thread Pools tutorial

你創建了

ExecutorService es = Executors.newSingleThreadExecutor(); 

一個執行的服務,您可以提交一個任務一樣

Runnable myRunnable = new MyRunnable(); 

es.submit(myRunnable); 

,並再次提交

es.submit(myRunnable); 
+0

請問你能解釋一下它是如何工作的嗎?我試了一些東西,但似乎不正確 –

+0

我已經添加了一個例子。你嘗試了什麼,你的意思是「不正確」? –

+0

我假設你的意思是'Executors.newSingleThreadExecutor()',對吧? – Nate

1

!!!好吧,它的工作,問題是int k。 我不得不在動作執行按鈕重新運行 謝謝大家!!! D