第九周学习总结&实验报告七
实验报告:
实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
实验代码:
package Java11;
class MyThread implements Runnable{
private int ticket = 1000;
public void run() {
for(int i = 0; i < 1000; i++) {
this.sale();
if(i == Math.sqrt(i) * Math.sqrt(i)) {
Thread.currentThread().yield();
}
}
}
public synchronized void sale() {
if(ticket > 0) {
try {
Thread.currentThread().sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖票:ticket="+ticket--);
}
}
}
package Java11;
public class 测试类 {
public static void main (String args[]) {
MyThread my = new MyThread();
Thread my1 = new Thread(my);
my1.setName("窗口1");
Thread my2 = new Thread(my);
my2.setName("窗口2");
Thread my3 = new Thread(my);
my3.setName("窗口3");
Thread my4 = new Thread(my);
my4.setName("窗口4");
Thread my5 = new Thread(my);
my5.setName("窗口5");
Thread my6 = new Thread(my);
my6.setName("窗口6");
Thread my7 = new Thread(my);
my7.setName("窗口7");
Thread my8 = new Thread(my);
my8.setName("窗口8");
Thread my9 = new Thread(my);
my9.setName("窗口9");
Thread my10 = new Thread(my);
my10.setName("窗口10");
my1.start();
my2.start();
my3.start();
my4.start();
my5.start();
my6.start();
my7.start();
my8.start();
my9.start();
my10.start();
}
}
进程与线程
进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,
多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。
启动线程:
线程的主要代码是在run方法里写的,但是启动的时候是调用Thread的start方法启动。
线程的状态
要想实现多线程,必须在主线程中创建新的线程对象。
任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。
取得和设置线程名称;
在Thread类中,可以通过getName()方法取得线程的
名称,通过setName()方法设置线程的名称。
线程的名称一般在启动线程前设置,但也允许为已经运行的线程设置名称。
允许两个Thread对象有相同的名字,但为了清晰,应该尽量避免这种情况的发生。
另外,如果程序并没有为线程指定名称,则系统会自动的为线程分配-一个名称。
同步代码块
在代码块上加上“synchronized"关键字的话,则此代码块就称为同步代码块。
代码块格式:
synchronized(同步对象){
需要同步的代码;
}