第九周课堂总结和实验

实验任务详情:

完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。

实验代码:

复制代码
package demo;

class MyThread implements Runnable{
    private int ticket = 1000;
    public void run() {
        for (int i=0;i<100;i++){
            synchronized (this){
                if (ticket>0){
                    try {
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"售票:ticket="+ticket--);
                }
            }
        }
    }
}
public class test {
    public static void main(String[] args) {
        MyThread mt=new MyThread();            
        new Thread(mt,"窗口1").start();                
        new Thread(mt,"窗口2").start();
        new Thread(mt,"窗口3").start();
        new Thread(mt,"窗口4").start();
        new Thread(mt,"窗口5").start();
        new Thread(mt,"窗口6").start();
        new Thread(mt,"窗口7").start();
        new Thread(mt,"窗口8").start();
        new Thread(mt,"窗口9").start();
        new Thread(mt,"窗口10").start();
    }
}
复制代码

结果截图:

实验总结:

这个题老师上课讲过,书上也有类似的代码,还算比较简单。就是有一个小瑕疵,总是连续一个窗口卖票,也不知道是cpu的问题还是什么。

课程总结:

1)多线程继承Tread类:

复制代码
class 类名称 extends Thread{
      属性***;
      方法***;
      public void run(){
           线程主体;
      }
}
复制代码

2)Rnunable接口实现多线程:

复制代码
class 类名称 implements Runnable{
     属性***;
     方法***;
     public void run(){
          线程主体;
     }
}
复制代码

3)synchronized

(1)指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁。

(2)直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。

(3)直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。

学习总结
1,继承Thread类创建线程:
Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。

2,实现Runnable接口创建线程:
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,可以实现一个Runnable接口

3,Thread类和Runnable接口的区别
实际上Thread类和Runnable接口之间在使用上也是有所区别的,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了Runnable接口,则可以方便的实现资源的共享。

4,通过synchronized实现资源同步

synchronized 关键字可以在整个class下进行锁定,避免static数据的同时访问。
当编写synchronized块时,有几个简单的准则可以遵循,这些准则在避免死锁和性能危险的风险大有帮助:
(1) 使代码块保持简短,把不随线程变化的预处理和后处理移出synchronized块 
(2) 不要阻塞。如 InputStream.read() 
(3) 在持有锁的时候,不要对其他对象调用方法

Java IO

使用File类进行文件的操作
以下是针对文件本身操作的
createNewFile(); 创建新文件
delete(); 删除一个指定文件
mkdir(); 创建一个文件夹
public String[]list(); 列出全部名称,返回一个字符串数组
public File[]listFiles(); 列完整的路径,返回一个File对象数组
isDirectory(); 判断一个给定的路径是否是目录

RandomAccessFile类可以对文件内容进行操作
不同操作系统的路径分隔符也是不同的,windows的是“”,Linux的是“/”。

所有的操作是由JAVA虚拟机进行的,所以会出现一定的延迟,所以在进行文件操作时要考虑延迟的影响

posted on 2019-10-25 20:46  莫念初  阅读(136)  评论(0编辑  收藏  举报

导航