实验任务详情:

完成火车站售票程序的模拟。

要求:

(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接口可以资源共享;
同步与死锁:如果多个线程需要操作,统一资源时就有可能出现资源的同步问题。