第九周课程总结&实验报告(七)

第九周课程总结&实验报告(七)

课程总结:

本周课程学习到了多线程和使用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张票的时候调试要花点时间。所以我在实验的时候设置成了比较小的时间延迟,然后再截图的

posted @ 2019-10-25 13:36  反语ooo  阅读(169)  评论(1编辑  收藏  举报