第九周课程总结
一、Runnable
接口相对于Thread
类的优势。
(1)适合多个相同程序代码的线程去处理同一资源的情况;
(2)可以避免由于Java
的单继承特性所带来的的局限;
(3)增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
二、线程的状态
要想实现多线程,必须在主线程中创建新的线程对象,任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。如下图:
三、线程操作的主要方法:
序号 | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public Thread(Runnable target) | 构造 | 接收Runnable接口子类对象,实例化Thread对象 |
2 | public Thread(Runnable target,String name) | 构造 | 接收Runnable接口子类对象,实例化Thread对象,并设置线程名称 |
3 | public Thread(String name) | 构造 | 实例化Thread对象,并设置线程名称 |
4 | public static Thread currentThread() | 普通 | 返回正在执行的线程 |
5 | public final String getName() | 普通 | 返回线程的名称 |
6 | public final int getPriority() | 普通 | 发挥线程的优先级 |
7 | public boolean isInterruped() | 普通 | 判断线程是否被中断,如果是,返回true;否则,返回false |
8 | public final boolean isAlive() | 普通 | 判断线程是否在活动,如果是,返回true;否则,返回false |
9 | public final void join() throws InterruptedException | 普通 | 等待线程死亡 |
10 | public final synchronized void join(long millis) throws InterruptedException | 普通 | 等待millis毫秒后,线程死亡 |
11 | public void fun() | 普通 | 执行线程 |
12 | public final void setName(String name) | 普通 | 设置线程名称 |
13 | public final void setPriority(int newPriority) | 普通 | 设定线程的优先值 |
14 | public static void sleep(long millis) throws InterruptedException | 普通 | 使目前正在执行的线程休眠millis毫秒 |
15 | public void start() | 普通 | 开始执行线程 |
16 | public String toString() | 普通 | 返回代表线程的字符串 |
17 | public static void yield() | 普通 | 将正在执行的线程暂停,允许其他线程执行 |
18 | public final void setDaemon(boolean on) | 普通 | 将一个线程设置成后台运行 |
四、线程的优先级
在Java
的线程中使用setPriority()
方法可以设置一个线程的优先级
序号 | 定义 | 描述 | 表示的常量 |
---|---|---|---|
1 | public static final int MIN_PRIORITY | 最低优先级 | 1 |
2 | public static final int NORM_PRIORITY | 中等优先级,是线程的默认优先级 | 5 |
3 | public static final int MAX_PRIORITY | 最高优先级 | 10 |
五、Java IO
File
定义:
(1)在整个IO
包中,唯一表示与文件本身有关的类就是File
类。
(2)使用File
类可以进行创建或删除文件等常用操作。
(3)要想使用File
类则首先要观察File
类的构造方法。
File
类的构造方法
public File (String pathname) ——>实例化`File`类的时候,必须设置好路径
File
类中的主要方法和常量
实例操作:创建一个新文件
实例操作:删除一个指定的文件
六、程序的问题:
(1)Windows
中使用反斜杠表示目录的分隔符:“”
。
(2)Linux
中使用正斜杠表示目录的分隔符:”/“
。
七、操作延迟
在每一次程序执行完毕之后,文件并不会立刻被创建或删除,会有一些延迟,这是因为所有的操作都需要通过JVM
完成所造成的的。如下图所示:
实验报告(七)
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
实验源代码
卖票系统
package dijiuzhou;
class Mp implements Runnable{
private long n=1000;
public long getN() {
return n;
}
public void setN(long n) {
this.n = n;
}
public void run() {
for(int i=0;i<1000;i++) {
synchronized(this) {
if(n==0) {
System.out.println(Thread.currentThread().getName()+"票已卖完");
break;
}
if(n>0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖票:"+"当前票数:n="+n--);
}
}
}
}
}
测试
package dijiuzhou;
public class Test {
public static void main(String[] args) {
Mp m=new Mp();
new Thread(m,"1窗口").start();
new Thread(m,"2窗口").start();
new Thread(m,"3窗口").start();
new Thread(m,"4窗口").start();
new Thread(m,"5窗口").start();
new Thread(m,"6窗口").start();
new Thread(m,"7窗口").start();
new Thread(m,"8窗口").start();
new Thread(m,"9窗口").start();
new Thread(m,"10窗口").start();
}
}
运行截图
自我评价
对于这次实验报告,自我感觉还可以,可能是因为老师讲过,再加上书上也有一个类似的,所以做起来并不吃力。