第九周课程总结&实验报告(七)
课程总结:
本周课程学习到了多线程和使用File类进行文件的操作
Java中多线程的实现主要是通过继承Thread类或实现Runnable接口。其中Runnable接口可以资源共享。两种方法都要通过覆写run();
通过Runnable接口创建线程的步骤如下:
1、定义实现Runnable接口的类,并实现该类中的run()方法。
2、建立一个Thread对象,并将实现的Runnable接口的类的对象作为参数传入Thread类的构造方法。
3、通过Thread类中的start()方法启动线程,并运行。
注:直接调用Thread类或Runnable类对象的run()方法是无法启动线程的,这只是一个简单的方法调用必须通过Thread方法中的start()才行。
实现Runnable接口相对于继承Thread类来说,有如下优势:
(1)适合相同程序的多个线程去处理同一资源的情况。
(2)可以避免由于Java的单继承特性带来的局限。
(3)增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
Runnable接口格式
class 类名称 implements Runnable{
属性;
方法;
public viod run(){
线程主体;
}
}
取得设置线程名称
在Thread类中,可以通过 getName() 方法取得线程的名称,通过 setName()方法设置线程的名称
同步代码块
synchronized(同步对象){ ///synchronized(this)this表示当前对象
需要同步的代码块;
}
同步方法
synchronized 方法返回值 方法名称(参数列表){
方法体
}
File类的构造方法
public File(String pathname):根据指定的路径(可以是绝对路径或相对路径)创建File对象。
public File(String parent, String child):根据指定的父文件夹和子文件或者子文件夹创建File对象
public File(File parent, Sting child):根据指定的父文件夹对象和子文件或者子文件夹创建File对象
使用RandonAcccessFile类写入数据
createNewFile(); 创建新文件
delete(); 删除一个指定文件
mkdir(); 创建一个文件夹
public String[]list(); 列出全部名称,返回一个字符串数组
public File[]listFiles(); 列完整的路径,返回一个File对象数组
isDirectory(); 判断一个给定的路径是否是目录
public String[] list():
若此File对象表示已存在的目录,则返回此目录下的所有文件名(不包括子目录中的文件)和一级子目录名的字符串数组;若此目录为空,则返回一个空数组;
若此File对象表示已存在的文件,则返回null;
若此File对象表示的目录或文件不存在,则返回null。
public File[] listFiles():作用同list()方法类似,只不过返回的数组元素是表示文件或目录的File对象。
public static File[] listRoots():返回系统所有的根路径的File对象。Windows中返回的就是盘符。
实验总结:
实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
源代码:
package test;
class Ticket implements Runnable{
private int tickets=1000;
public int getTickets() {
return tickets;
}
public void setTickets(int tickets) {
this.tickets = tickets;
}
public void run() {
while(true) {
synchronized(this){
try {
if(tickets>0) {
System.out.println(Thread.currentThread().getName()+":第 "+tickets+" 张票 ");
tickets--;
}
Thread.sleep(1000);
}catch(Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
}
if(tickets<=0){
break;
}
}
}
}
public class Maechine {
public static void main(String[] args) {
Ticket mt=new Ticket();
Thread t1=new Thread(mt,"窗口1");
Thread t2=new Thread(mt,"窗口2");
Thread t3=new Thread(mt,"窗口3");
Thread t4=new Thread(mt,"窗口4");
Thread t5=new Thread(mt,"窗口5");
Thread t6=new Thread(mt,"窗口6");
Thread t7=new Thread(mt,"窗口7");
Thread t8=new Thread(mt,"窗口8");
Thread t9=new Thread(mt,"窗口9");
Thread t10=new Thread(mt,"窗口10");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
t8.start();
t9.start();
t10.start();
}
}
实验截图:
本次作业由于上课的时候老师讲过,在加上书上也有类似的例子理解了实际上做起来不是特别难,只是延迟时间设置成1秒钟,卖1000张票的时候调试要花点时间。所以我在实验的时候设置成了比较小的时间延迟,然后再截图的