我編碼一個小遊戲,其目標是管理一個商場。我的問題是動畫。線程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
?
一旦執行'Thread'就不應該重新運行,而應該創建一個新的'Thread'對象並運行它。 –
我們認識到代碼的相關部分(除非你希望我們開始猜測:))。 – gkalpak