私の考案した例では、teamMembersのリストに関してスレッドセーフにどのような影響がありますか?
メソッドから見たリストの状態にrun()
一貫性があると信頼できますか?
仮定
このメソッドは、 Bean
setATeamMembers
を作成している春までに一度だけ呼び出されます。ATeamEpisode
メソッドは、
init
#1の後にspring(init-method)によって呼び出されますクラスは
ATeamMember
不変ですteamMembers
volatile
または同様のものを宣言する必要がありますか?私が見落としているこのアプローチに関する他の恐ろしい問題はありますか?
これが明らかな場合はお詫び、またはrtfmの明らかな失敗
ありがとう、よろしく
エド
package aTeam;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ATeamEpisode implements Runnable{
private List<ATeamMember> teamMembers;
/* DI by spring */
public void setATeamMembers(List<ATeamMember> teamMembers){
this.teamMembers = new ArrayList<ATeamMember>(teamMembers);
}
private Thread skirmishThread;
public synchronized void init(){
System.out.println("Starting skirmish");
destroy();
(skirmishThread = new Thread(this,"SkirmishThread")).start();
}
public synchronized void destroy(){
if (skirmishThread != null){
skirmishThread.interrupt();
skirmishThread=null;
}
}
private void firesWildlyIntoTheAir(ATeamMember teamMember){
System.out.println(teamMember.getName()+" sprays the sky..");
}
@Override
public void run() {
try {
Random rnd = new Random();
while(! Thread.interrupted()){
firesWildlyIntoTheAir(teamMembers.get(rnd.nextInt(teamMembers.size())));
Thread.sleep(1000 * rnd.nextInt(5));
}
} catch (InterruptedException e) {
System.out.println("End of skirmish");
/* edit as per Adam's suggestion */
// Thread.currentThread().interrupt();
}
}
}