第九周课程总结&实验报告(七)

第九周课程总结&实验报告(七)

实验任务详情:

完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。

实验过程:

1.实验代码

public class Test {
    public static void main(String[] args){
        Thread[] t=new Thread[10];
        Market mar=new Market();
        mar.setTicket(1000);
        for(int i=0;i<10;i++){
            new Thread(mar,i+1+"窗口").start();
        }
    }
}
package com.company;

public class  Market implements Runnable{
  private int ticket;
    void setTicket(int ticket) {
        this.ticket = ticket;
    }
    public int getTicket() {
        return ticket;
    }
    public void  run() {
        for(int i=1;i<100;i++) {
            synchronized (this) {
                if (ticket > 0) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    ticket--;
                    System.out.println(Thread.currentThread().getName() + "卖票成功;" +"余票:"+ticket);
                }
            }
        }
    }
}

2.代码截图

3.实验结果

 

总结

进程与线程

 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程。
 多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。

启动线程

线程的主要代码是在run方法里写的,但是启动的时候是调用Thread的start方法启动。

线程的状态

要想实现多线程,必须在主线程中创建新的线程对象。任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。

取得和设置线程名称;

在Thread类中,可以通过getName()方法取得线程的
名称,通过setName()方法设置线程的名称。

线程的名称一般在启动线程前设置,但也允许为已经运行的线程设置名称。允许两个Thread对象有相同的名字,但为了清晰,应该尽量避免这种情况的发生。

另外,如果程序并没有为线程指定名称,则系统会自动的为线程分配-一个名称。

同步代码块

在代码块上加上“synchronized"关键字的话,则此代码块就称为同步代码块。
代码块格式:
      synchronized(同步对象){
      需要同步的代码;
      }
原文地址:https://www.cnblogs.com/girlsteam/p/11737576.html