質問: 山手線と京浜東北線の路線図をもとにスレッドを作るという問題で 京浜東北線ルートは 大宮>浦和>川口>赤羽>田端>日暮里>上野>秋葉原>東京>浜松町>品川>蒲田>川崎>横浜>大船 で終わる。 山手線ルートは 田端>日暮里>上野>秋葉原>東京>浜松町>品川>渋谷>新宿>池袋 といってまた田畑に戻る。 条件 1.山手線は周回運転し、京浜東北は往復運転する。 2.山手線の各駅間の所要時間は1秒。 3.京浜東北線の所要時間は山手線と同一区間は1秒。京浜東北線のみの区間は1.533秒とする。 4.京浜東北線は終着駅。大宮駅、大船駅に到着した場合は3秒間 停車するものとする。 /*出力結果 山手線:東京につきました。 山手線:東京をでました。 京浜東北線:大船につきました。 山手線:浜松町につきました。 山手線:浜松町をでました。 山手線:品川につきました。 山手線:品川をでました。 山手線:渋谷につきました。 山手線:渋谷をでました。 京浜東北線:大船をでました。 山手線:新宿につきました。 山手線:新宿をでました。 京浜東北線:横浜につきました。 京浜東北線:横浜をでました。 山手線:池袋につきました。 山手線:池袋をでました。 */ スレッドをつかって上の出力結果をだしたいのですがどのようにしたらよいのかわかりません!! どのようにしたらうえの出力結果が得られますか?
回答: 一応作ってみました。 質問文のような動きをするだけなら、こんなふうに作る必要はないような気もします... バグってたらすみません。適当に直して下さい。 ---------------------------------------------------------------- import java.util.*; class 駅 { String 駅名; double 起点距離;//起点からの距離(時間で代替) double 停車時間; public 駅(String name, double range, double stopTime){ 駅名 = name; 起点距離 = range; 停車時間 = stopTime; } } /* 京浜東北線 大宮>浦和>川口>赤羽>田端>日暮里>上野>秋葉原>東京>浜松町>品川>蒲田>川崎>横浜>大船 山手線 田端>日暮里>上野>秋葉原>東京>浜松町>品川>渋谷>新宿>池袋 */ class 路線 { static final 路線 京浜東北線; static final 路線 山手線; static { 京浜東北線 = new 路線("\t\t京浜東北線"); 京浜東北線.始点 = new 駅("大宮", 0.0 , 3.0/2);//発着で3秒 京浜東北線.駅リスト.add(京浜東北線.始点); 京浜東北線.駅リスト.add(new 駅("浦和", 1.533, 0.0)); 京浜東北線.駅リスト.add(new 駅("川口", 3.066, 0.0)); 京浜東北線.駅リスト.add(new 駅("赤羽", 4.599, 0.0)); 京浜東北線.駅リスト.add(new 駅("田端" , 6.132, 0.0)); 京浜東北線.駅リスト.add(new 駅("日暮里", 7.132, 0.0)); 京浜東北線.駅リスト.add(new 駅("上野" , 8.132, 0.0)); 京浜東北線.駅リスト.add(new 駅("秋葉原", 9.132, 0.0)); 京浜東北線.駅リスト.add(new 駅("東京" ,10.132, 0.0)); 京浜東北線.駅リスト.add(new 駅("浜松町",11.132, 0.0)); 京浜東北線.駅リスト.add(new 駅("品川" ,12.132, 0.0)); 京浜東北線.駅リスト.add(new 駅("蒲田", 13.665, 0.0)); 京浜東北線.駅リスト.add(new 駅("川崎", 15.198, 0.0)); 京浜東北線.駅リスト.add(new 駅("横浜", 16.731, 0.0)); 京浜東北線.終点 = new 駅("大船", 18.264, 3.0/2); 京浜東北線.駅リスト.add(京浜東北線.終点); 山手線 = new 路線("山手線"); 山手線.始点 = new 駅("田端" , 0.0, 0.0); 山手線.駅リスト.add(山手線.始点); 山手線.駅リスト.add(new 駅("日暮里", 1.0, 0.0)); 山手線.駅リスト.add(new 駅("上野" , 2.0, 0.0)); 山手線.駅リスト.add(new 駅("秋葉原", 3.0, 0.0)); 山手線.駅リスト.add(new 駅("東京" , 4.0, 0.0)); 山手線.駅リスト.add(new 駅("浜松町", 5.0, 0.0)); 山手線.駅リスト.add(new 駅("品川" , 6.0, 0.0)); 山手線.駅リスト.add(new 駅("渋谷" , 7.0, 0.0)); 山手線.駅リスト.add(new 駅("新宿" , 8.0, 0.0)); 山手線.駅リスト.add(new 駅("池袋" , 9.0, 0.0)); 山手線.終点 = new 駅("田端" ,10.0, 0.0); 山手線.駅リスト.add(山手線.終点); } String 路線名; LinkedList<駅> 駅リスト = new LinkedList<駅>(); 駅 始点; 駅 終点; public 路線(String name){ 路線名 = name; } } class 列車 implements Runnable { static enum 運行 { 往復, 循環 }; static enum 方向 { 順行, 逆行 }; Thread aThread; 路線 aLine; 運行 運転; 方向 進行方向; boolean 運行中 = true; public 列車(路線 line, 運行 dir) { aThread = new Thread(this); aLine = line; 運転 = dir; 進行方向 = 方向.順行; } public void start() { aThread.start(); } public void 停止(){ 運行中 = false; } public void run() { ListIterator<駅> itr; while(運行中){ if(進行方向 == 方向.順行){ itr = aLine.駅リスト.listIterator(0); while (itr.hasNext()) { 駅 station = itr.next(); if(aLine.始点 != station){ System.out.println(aLine.路線名+":"+station.駅名+"につきました。"); } if(itr.hasNext()){ try { Thread.sleep((long)(station.停車時間*1000)); System.out.println(aLine.路線名+":"+station.駅名+"をでました。"); int index = itr.nextIndex(); 駅 次の駅 = aLine.駅リスト.get(index); Thread.sleep((long)(Math.abs(次の駅.起点距離 - station.起点距離)*1000)); } catch (InterruptedException e){} } } } else { // 逆行 itr = aLine.駅リスト.listIterator(aLine.駅リスト.size()); while (itr.hasPrevious()) { 駅 station = itr.previous(); if(aLine.終点 != station){ System.out.println(aLine.路線名+":"+station.駅名+"につきました。"); } if(itr.hasPrevious()){ try { Thread.sleep((long)(station.停車時間*1000)); System.out.println(aLine.路線名+":"+station.駅名+"をでました。"); int index = itr.previousIndex(); 駅 次の駅 = aLine.駅リスト.get(index); Thread.sleep((long)(Math.abs(次の駅.起点距離 - station.起点距離)*1000)); } catch (InterruptedException e){} } } } if(運転 == 運行.往復){ 進行方向 = (進行方向 == 方向.順行)? 方向.逆行 : 方向.順行; } } } } public class Railway { public static void main(String args[]) { 列車 train1 = new 列車(路線.山手線, 列車.運行.循環); 列車 train2 = new 列車(路線.京浜東北線, 列車.運行.往復); train1.start(); train2.start(); try{ Thread.sleep(5*60*1000);//5分待つ } catch (InterruptedException e){} train1.停止(); train2.停止(); } }