大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
既然用JAVA,那就来个面向对象的分析
目前创新互联建站已为近1000家的企业提供了网站建设、域名、虚拟空间、绵阳服务器托管、企业网站设计、城关网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
关键处: 需要一个"选择器"来依据数值区间得到一个反馈值,
定义接口
public interface Responsor {
public Object response();
}
定义实现
final public class PriceResponsor implements Responsor{
private int ticketsCount;
public PriceResponsor(int ticketsCount) {
this.ticketsCount = ticketsCount;
}
/**
* business implement
* @return the unit price according as tickets total number
*/
public Integer response() {
if (ticketsCount 0)
throw new IllegalArgumentException("negative is invalid");
if (ticketsCount 11) return 20;
if (ticketsCount = 11 ticketsCount 21) return 15;
if (ticketsCount = 21 ticketsCount 31) return 10;
if (ticketsCount = 31) return 8;
return null;
}
public Integer getTotalPrice() {
Integer I = response();
if (I == null) return null;
return ticketsCount*I;
}
}
演示代码:(从命令行输入一个整数表示票的张数)
final public class TicketPriceDemo {
private static final String USAGE = "TicketPriceDemo [a integer represents the ticketsCount]";
private static final String PARAMETER_TYPE="Parameter should be a integer";
public static void main(String[] args) {
if (args.length != 1) {
System.out.println(USAGE);
System.exit(1);
}
int c = 0;
try {
c = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.out.println(PARAMETER_TYPE+"\r\n"+USAGE);
System.exit(1);
}
PriceResponsor responsor = new PriceResponsor(c);
System.out.println("unit price : " + responsor.response());
System.out.println("total price:" + responsor.getTotalPrice());
}
}
这个规则就是设计一个方法,该方法最后值为一个票价,参数应该是身高,所以有如下代码
public class PriceTest {
public static void main(String[] args) {
int childPrice = getPrice(1.2);
int adultPrice = getPrice(1.5);
System.out.println("1.2米身高的票价为:"+childPrice);
System.out.println("1.5米身高的成人票价为:"+adultPrice);
}
private static int getPrice(double height) {
return height 1.2?10:5;
}
}
最后结果如下:
首先,定义的锁(lock)不对,必须是同一个锁,像你这样用this,new多少个MyThread就有多少个锁,违反了线程的同步机制;
其次,你如果想要呈现多线程的竞争,不可以在run方法里让一个线程一直运行而不释放锁,应该使用wait()/notify();
以下我稍微修改下,会形成两个线程交替执行的情形:
public class ThreadTest {
public static Object obj = new Object();
public static int number = 10;// 用static共享票源,不知道可以不,按理说是可以的
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread my = new MyThread();
MyThread my2 = new MyThread();
Thread t1 = new Thread(my2, "2号窗口");
Thread t2 = new Thread(my, "1号窗口");
t1.start();
t2.start();
}
static class MyThread implements Runnable {
public void run() {
while (true)
synchronized (obj) {
if (number 0) {
System.out.println(Thread.currentThread().getName()
+ "正在卖票," + "还剩" + number + "张票");
number--;
obj.notifyAll();
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
break;
}
}
}
}
public class ShowDemo{
public static void main(String[] rags)throws Exception{
MyThread mt= new MyThread();
Thread th1 = new Thread(mt,"售票一");
Thread th2 = new Thread(mt,"售票二");
Thread th3 = new Thread(mt,"售票三");
Thread th4 = new Thread(mt,"售票四");
th1.start();th2.start();th3.start();th4.start();
}
}
class MyThread implements Runnable{
int ticket=1;
public void run(){
while(ticket=100){
if("售票一".equals(Thread.currentThread().getName()) ticket%2!=0){
System.out.println("售票一售出:"+ticket++);
}
if("售票二".equals(Thread.currentThread().getName()) ticket%2!=0){
System.out.println("售票二售出:"+ticket++);
}
if("售票三".equals(Thread.currentThread().getName()) ticket%2==0){
System.out.println("售票三售出:"+ticket++);
}
if("售票四".equals(Thread.currentThread().getName()) ticket%4==0){
System.out.println("售票四售出:"+ticket++);
}
}
}
}