实验报告七&&课程总结
Java实验报告
班级 计科二班 学号 20188450 姓名 李代传
完成时间 2019.10.22
评分等级
实验代码1 |
package 火车站售票程序;
public class Voting implements Runnable { private int votings=1000; @Override public void run() { // TODO Auto-generated method stub while(true) { //买票循环,不买完不结束。 if(this.VotingMain()!=1) { //卖光票,结束线程。 System.out.println(Thread.currentThread().getName()+"票已卖光"); return; } try { Thread.yield(); //线程礼让,在睡眠一秒之前,买票之后。 Thread.sleep(1000); }catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public synchronized int VotingMain() { //同步方法。 if(this.votings>=1) { this.votings--; System.out.println(Thread.currentThread().getName()+"购票成功!"+"剩余票数"+this.votings); return 1; } return 0; } } |
package 火车站售票程序;
public class Main {
public static void main(String[] args) { // TODO Auto-generated method stub Voting v=new Voting(); for(int i=0;i<10;i++) { new Thread(v).start();//创建十个线程并直接让线程就绪 } }
} |
实验结果 依此类推-> Thread-2购票成功!剩余票数40 Thread-5购票成功!剩余票数39 Thread-9购票成功!剩余票数38 Thread-7购票成功!剩余票数37 Thread-0购票成功!剩余票数36 Thread-3购票成功!剩余票数35 Thread-6购票成功!剩余票数34 Thread-2购票成功!剩余票数33 Thread-4购票成功!剩余票数32 Thread-1购票成功!剩余票数31 Thread-8购票成功!剩余票数30 Thread-9购票成功!剩余票数29 Thread-5购票成功!剩余票数28 Thread-0购票成功!剩余票数27 Thread-7购票成功!剩余票数26 Thread-3购票成功!剩余票数25 Thread-6购票成功!剩余票数24 Thread-8购票成功!剩余票数23 Thread-4购票成功!剩余票数22 Thread-1购票成功!剩余票数21 Thread-2购票成功!剩余票数20 Thread-9购票成功!剩余票数19 Thread-5购票成功!剩余票数18 Thread-0购票成功!剩余票数17 Thread-7购票成功!剩余票数16 Thread-3购票成功!剩余票数15 Thread-6购票成功!剩余票数14 Thread-4购票成功!剩余票数13 Thread-2购票成功!剩余票数12 Thread-1购票成功!剩余票数11 Thread-8购票成功!剩余票数10 Thread-5购票成功!剩余票数9 Thread-9购票成功!剩余票数8 Thread-0购票成功!剩余票数7 Thread-7购票成功!剩余票数6 Thread-3购票成功!剩余票数5 Thread-6购票成功!剩余票数4 Thread-2购票成功!剩余票数3 Thread-8购票成功!剩余票数2 Thread-4购票成功!剩余票数1 Thread-1购票成功!剩余票数0 Thread-9票已卖光 Thread-5票已卖光 Thread-0票已卖光 Thread-7票已卖光 Thread-3票已卖光 Thread-6票已卖光 Thread-2票已卖光 Thread-1票已卖光 Thread-8票已卖光 Thread-4票已卖光 |
实验总结
很多同学反应启动不了多线程,我虽然没碰到无法执行多线程的情况。但是我借用了一个不能执行多线程的代码,多次修改后,发现可能是因为Thread.Sleep(1000)的放置的问题。具体情况如下:如果放在了同步(synchronized)方法中,在Run()方法循环中调用此方法,就会出现一直是一个线程输出的情况。如果此时在Run()方法中加入Thread.Sleep(),就能看到其他线程的输出了。
对于以上情况,我又想到了老师上课的那段代码,虽然也是放在(synchronized)同步代码块中,但是依旧是放在Run()方法中。
所以,是不是如果要用这个Thread.Sleep()的时候,必须要放在Run()方法中才能看到多个线程的输出呢?
课程总结
近期我们上课氛围很差,使得老师不能像以前一样全力教导我们。但是我还是按自己的步伐去学习,专心听讲。这上一节课的File类,上课时虽然看懂了,但是实际操作肯定会有很多问题。所以也得自己多去操作,用一用类里的方法,以便自己熟悉。