第九周课程总结&实验报告(七)
第九周课程总结&实验报告(七)
实验任务详情:
完成火车站售票程序的模拟。 要求: (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(同步对象){ 需要同步的代码; }