第九周课程总结&实验报告(七)
实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
1、实验代码
package 二;
public class MyThread implements Runnable{ 实现runnable接口
private int ticket = 1000; 设置票数1000张
public void run() { 覆写run的方法
for (int i=0;i<2000;i++) { 超出票数的循环
synchronized (this) { 设置需要同步的操作
if (ticket>0) { 判断是否有剩余票
try {
Thread.sleep(1000); 卖票过程延迟一秒钟
}catch (InterruptedException e) { 捕捉异常
e.printStackTrace(); 打印
}
System.out.println(Thread.currentThread().getName()+"售票:ticket = " + ticket--); 输出
}
}
}
}
};
测试类
package 二;
public class text {
public static void main (String[] args) {
MyThread mt = new MyThread(); 定义线程对象
Thread[] m=new Thread[10]; 定义thread对象
for(int i=0;i<10;i++) { 利用for循环输出10个卖票窗口
m[i]=new Thread(mt);
m[i].setName("窗口"+i); 设置
m[i].start(); 启动
}
}
}
本题难易程度还行,没有什么错误,本来我是用一个很麻烦的方法来设置输出10个窗口的,我觉得这样太麻烦,不简洁,就问老师如何用for循环一次性输出,老师说用
数组就可以实现,因此我改进了一下我的代码;
本周自学小结。
1、class类作用
它代表着一个类的类型信息。正是因为这个特殊作用的存在,Class类能够实现它所代表的这个类的所有功能,包括创建这个类的实例,获得所有的构造函数,方法,字段值等等。
2.Class类里面存储了什么
既然我们知道Class类是表示类型的一个特殊的类,那么它是怎么表示某个类或者对象的类型呢?或者说,它里面存储了什么呢?通过反射机制我们知道,Class里面存储了对应类的
几乎所有的信息,当然这些信息是未初始化的信息,比如所有的方法,所有的构造函数,所有的字段(成员属性)等等。
那这些信息是怎么存储进去的呢?好吧,这个应该去深入的参考java虚拟机规范吧,毕竟Class这个类的构造函数是私有的,可能是底层的C++代码实现的。
本周学习小结
Thread类的常用方法
String getName() 返回该线程的名称。
void setName(String name) 改变线程名称,使之与参数 name 相同。
int getPriority() 返回线程的优先级。
void setPriority(int newPriority) 更改线程的优先级。
boolean isDaemon() 测试该线程是否为守护线程。
void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。
static void sleep(long millis)
void interrupt() 中断线程。
static void yield() 暂停当前正在执行的线程对象,并执行其他线程。
void join() 等待该线程终止。
void run()
void start()
从Object类继承来的方法 void notify() void wait()
1)start方法
start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源。
2)run方法
run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务。注意,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务。
3)sleep方法
sleep方法有两个重载版本:
sleep(long millis) //参数为毫秒
sleep(long millis,int nanoseconds) //第一参数为毫秒,第二个参数为纳秒
sleep相当于让线程睡眠,交出CPU,让CPU去执行其他的任务。
如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep()方法来实现。
当当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间内,该线程不会获得执行机会,即使系统中没有其他可执行线程,处于sleep()中的线程也不会执行,因此sleep()方法常用来暂停程序的执行
yield方法
它也是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入到就绪状态。
也就是线程的礼让,其他线程先执行。
join()方法
强制执行自己,其他线程无法执行
interrupt()方法
中断线程执行
setpriority()方法
分max,norm和min,是从小到大。
Synchronzied
Synchronzied关键字的作用一个词概括就是:线程同步。它可以用来修改对象中的方法,将对象加锁。相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),
有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行。
Synchronzied关键字包括两种用法:synchronized 方法和 synchronized 块。
File 类简介
在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象。File 类定义了一些与平台无关的方法来操作文件,File类主要用来获取或处理与磁盘文件相关的信息,像文件名、 文件路径、访问权限和修改日期等,
还可以浏览子目录层次结构。
File类提供了如下三种形式构造方法。
File(File parent,String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(String pathname):通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。如果给定字符串是空字符串,则结果是空的抽象路径名。
File(String parent,String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
好好学习,天天向上。