实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
实验代码:
package 作业;
class MyThread implements Runnable{
private int ticket=10;
public void run() {
for(int i=0;i<10;i++) {
this.sale();
}
}
public synchronized void sale() {
if(ticket>0) {
try {
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在售出第"+ticket--+"张票");
}
}
};
public class test {
public static void main(String args[]) {
MyThread my=new MyThread();
Thread t1 = new Thread(my,"1号窗口");
Thread t2 = new Thread(my,"2号窗口");
Thread t3 = new Thread(my,"3号窗口");
Thread t4 = new Thread(my,"4号窗口");
Thread t5 = new Thread(my,"5号窗口");
Thread t6 = new Thread(my,"6号窗口");
Thread t7 = new Thread(my,"7号窗口");
Thread t8 = new Thread(my,"8号窗口");
Thread t9 = new Thread(my,"9号窗口");
Thread t10 = new Thread(my,"10号窗口");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
t8.start();
t9.start();
t10.start();
}
}
运行结果截图:
设计思路:
1、一开始是和书上271页是一样的;
2、改进后用getname取得线程名字,但不喜欢系统给的-1、-2;
3、用new Thread(my,"线程A").start;手工设置线程名字。
课程总结:
进程是程序的一次动态执行过程,它经历了从代码加载,执行到执行完毕的一个完整过程,这个过程也是进程本身从产生,发展到最终消亡的过程。多个线程交替运行,单核运行方式。
在Java中,实现多线程代码有两种方式:一种是继承Thread类;另一种是实现Runnable接口。
继承Thread类
一个类只要继承了Thread类,就称为多线程操作,在Thread子类中,必须明确覆写run()方法;启动线程用start()方法。
class 类名称 extends Thread{
属性***;
方法***;
public void run(){
线程主体;
}
}
Thread类不可共享资源
Runnable接口
因为启动一个多线程必须要使用start()方法,所以本质还是依靠Thread类启动。
Runnable接口可以资源共享;
同步与死锁:如果多个线程需要操作,统一资源时就有可能出现资源的同步问题。