第九周课堂总结和实验
实验任务详情:
完成火车站售票程序的模拟。
要求:
(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虚拟机进行的,所以会出现一定的延迟,所以在进行文件操作时要考虑延迟的影响