实验报告(七)
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
实验代码:
MyThread
1 class MyThread implements Runnable{ 2 private int ticket=1000; 3 public void run() { 4 for(int i=0;i<1000;i++) { 5 synchronized(this) { 6 if(ticket>=0) { 7 try { 8 9 }catch(Exception e){ 10 e.printStackTrace(); 11 } 12 System.out.println(Thread.currentThread().getName()+"售票,剩余票数:"+ticket--); 13 } 14 } 15 } 16 } 17 18 19 }
实现类 Demo1
1 public class Demo1 { 2 3 public static void main(String[] args) { 4 MyThread mt=new MyThread(); 5 Thread t2=new Thread(mt,"窗口2"); 6 Thread t1=new Thread(mt,"窗口1"); 7 Thread t3=new Thread(mt,"窗口3"); 8 Thread t4=new Thread(mt,"窗口4"); 9 Thread t5=new Thread(mt,"窗口5"); 10 Thread t6=new Thread(mt,"窗口6"); 11 Thread t7=new Thread(mt,"窗口7"); 12 Thread t8=new Thread(mt,"窗口8"); 13 Thread t9=new Thread(mt,"窗口9"); 14 Thread t10=new Thread(mt,"窗口10"); 15 t6.start(); 16 t2.start(); 17 t1.start(); 18 t10.start(); 19 t4.start(); 20 t8.start(); 21 t7.start(); 22 t3.start(); 23 t9.start(); 24 t5.start(); 25 26 27 } 28 29 }
实验结果
本题比较简单,由于是初次使用Runnable接口,所以难免会有一些不熟练。代码还可以简化,比如用类数组和for循环可以简化接口的实例化。但是由于意义不大就没有改写原代码。
第九周课程总结
本周主要学习了以下几个知识点:一,线程(1)线程的状态 (2)线程操作的相关方法
二,JavaIO(3)File类 (4)RandomAccessFile类
一,线程:
(1)线程的状态
线程主要有五种状态,分别是:
①创建状态:在程序中用构造方法创建一个线程对象后,新的线程对象便处于新建状态。此时,它拥有对应的内存空间和其他资源,但还处于不可运行状态。
②就绪状态:新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程进入就绪状态。此时,线程将进入线程队列排队,等待CPU服务。
③运行状态:当就绪状态的线程被调用并获得CPU资源时,线程进入运行状态。此时,自动调用该线程对象的run()方法。
④堵塞状态:一个正在执行的线程在某些特殊情况下,如果被人为挂起或需要执行耗时输入输出操作时,CPU会中断该线程的执行,进入堵塞状态。
⑤死亡状态:线程调用stop()或run()方法执行结束后,即进入死亡状态。
(2)线程操作的相关方法
static int activeCount()
返回当前线程的线程组中活动线程的数目。
void
checkAccess()
判定当前运行的线程是否有权修改该线程。
int
countStackFrames()
已过时。 该调用的定义依赖于 suspend(),但它遭到了反对。此外,该调用的结果从来都不是意义明确的。
static Thread
currentThread()
返回对当前正在执行的线程对象的引用。
static void
dumpStack()
将当前线程的堆栈跟踪打印至标准错误流。
static int
enumerate(Thread[] tarray)
将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中。
static
Map<Thread,StackTraceElement[]> getAllStackTraces()
返回所有活动线程的堆栈跟踪的一个映射。
ClassLoader
getContextClassLoader()
返回该线程的上下文 ClassLoader。
static Thread.UncaughtExceptionHandler
getDefaultUncaughtExceptionHandler()
返回线程由于未捕获到异常而突然终止时调用的默认处理程序。
long getId()
返回该线程的标识符。
String
getName()
返回该线程的名称。
int
getPriority()
返回线程的优先级。
StackTraceElement[]
getStackTrace()
返回一个表示该线程堆栈转储的堆栈跟踪元素数组。
Thread.State
getState()
返回该线程的状态。
ThreadGroup
getThreadGroup()
返回该线程所属的线程组。
Thread.UncaughtExceptionHandler
getUncaughtExceptionHandler()
返回该线程由于未捕获到异常而突然终止时调用的处理程序。
static boolean
holdsLock(Object obj)
当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。
void
interrupt()
中断线程。
static boolean
interrupted()
测试当前线程是否已经中断。
boolean
isAlive()
测试线程是否处于活动状态。
boolean
isDaemon()
测试该线程是否为守护线程。
boolean
isInterrupted()
测试线程是否已经中断。
void join()
等待该线程终止。
void
join(long millis)
等待该线程终止的时间最长为 millis 毫秒。
void
join(long millis, int nanos)
等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
void resume()
已过时。 该方法只与 suspend() 一起使用,但 suspend() 已经遭到反对,因为它具有死锁倾向。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?。
void run()
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
void
setContextClassLoader(ClassLoader cl)
设置该线程的上下文 ClassLoader。
void
setDaemon(boolean on)
将该线程标记为守护线程或用户线程。
static void
setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。
void
setName(String name)
改变线程名称,使之与参数 name 相同。
void
setPriority(int newPriority)
更改线程的优先级。
void
setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
设置该线程由于未捕获到异常而突然终止时调用的处理程序。
static void
sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
static void
sleep(long millis, int nanos)
在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
static void yield() 暂停当前正在执行的线程对象,并执行其他线程。
二,File类
(1)File类的主要介绍
File类可以进行创建或删除文件等常用操作。
File类的构造方法
public File(String pathname) //实例化File类时,必须设置好路径
(2)File类的主要方法和常量
file.createNewFile(); 创建空文件 创建成功返回true 创建失败返回false
file.delete(); 删除文件 删除成功返回true 删除失败返回false
file.exists(); 判断文件或目录是否存在 存在返回true 不存在返回false
file.isFile(); 判断是否是文件 是文件返回true 不是文件返回false
file.isDirectory(); 判断是否是目录 是目录返回true 不是目录返回false
file.getName(); 获取文件或目录的名称 返回String类型文件或目录的名称
file.getPath(); 获取文件或目录的地址 返回String类型文件或目录的地址
file.getAbsolutePath(); 获取文件或目录的绝对路径 返回String类型文件或目录的绝对路径
file.lastModified(); 获取文件或目录的最后修改日期 返回long类型文件或目录的最后修改日期
file.length(); 获取文件或目录的大小,单位为字符 返回int类型文件或目录的大小,单位为字符
(3)RandomAccessFile类