黑马程序员----交通灯系统注意点归纳二

---------------------- android培训java培训、期待与您交流! ----------------------

以下是Road类:

package com.itcast.interview.traffic;

					import java.util.ArrayList;
					import java.util.List;
					import java.util.Random;
					import java.util.concurrent.ExecutorService;
					import java.util.concurrent.Executors;
					import java.util.concurrent.ScheduledExecutorService;
					import java.util.concurrent.TimeUnit;


					public class Road {
						private List <String> vehicles = new ArrayList <String>();
						private String name;
						
						public Road(String name){
							this.name = name;
							ExecutorService pool = Executors.newSingleThreadExecutor();
							pool.execute(new Runnable(){//假设这条路上随机(1~10秒)出现一辆车;

								@Override
								public void run() {
									for(int i = 0;i<1000;i++){
										try {
											Thread.sleep((new Random().nextInt(10)+1)*1000);
										} catch (InterruptedException e) {
											e.printStackTrace();
										}
										vehicles.add(Road.this.name+" "+i);//这里name与方法形参、成员变量重复!!!可在形参前加final修饰或前面的方法(注意!!!!)
									}
								}
							});
							ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);//设定线程调度,如果是绿灯一秒通过一辆车
							timer.scheduleAtFixedRate(
									new Runnable(){

										@Override
										public void run() {
											if(vehicles.size()>0){
												boolean lighted = Lamp.valueOf(Road.this.name).isLighted();//内部类访问外部类时,要用类名.this.参数名
												if(lighted){
													System.out.println(vehicles.remove(0)+"is traversing !");
												}
											}
											
										}
										
									}, 
									1,
									1, 
									TimeUnit.SECONDS);
						}
					}

 线程注意点: Executors类(线程池),在jdk1.5新加入的java.util.concurrent包中
       
       1:创建一个单线程方法
           ExecutorService pool = Executors.newSingleThreadExecutor();
           pool.execute(new Runnable(){
             public void run(){}
            })
       2:创建线程调度
           ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);//设定线程调度,如果是绿灯一秒通过一辆车
           timer.scheduleAtFixedRate(new Runnable(){
             public void run()
            },
            1,
            1,
            TimeUnit.SECONDS);这个线程设置为首次延迟1秒执行,之后每1秒执行run()方法。
           
       3:内部类访问外部类
            内部类访问外部类属性时,应用外部类名.this.属性名!!
---------------------- android培训java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima

 

你可能感兴趣的:(程序员)