zoukankan      html  css  js  c++  java
  • 第九周课程总结&实验报告(七)

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

    课程总结:

    (一)多线程

    • 1.这一周我们接着上一周的多线程学习了实现Runnable接口,上一周中学习了Thread类,thread类实现的是多线程,但是这个还是很局限的,而Runnable接口是用来实现资源共享同时也可以通过Runnable接口的方式实现多线程。
    格式:
    class 类名称 implements Runnable{
         属性;
         方法;
         public viod run(){
                线程主体;
       }
    }
    

    我们需要注意的是,如果我们启动的是Runnable接口,那么我们仍然要依靠thread类完成启动,在Thread类中提供构造方法。在启动的时候我们就需要调用start()方法来完成,当然如果是是继承了####Thread类,则可以直接在Thread类中使用start()方法。所以说无论哪一种方法最终都需要依靠Thread类才能启动多线程。

    实现Runnable接口相对于继承Thread类来说,有如下优势:

    • (1)适合多个相同程序代码的线程去处理同一资源情况;
    • (2)可以避免由于Java的单继承特性所带来的局限;
    • (3)增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;
      2.线程一般具有5种状态,即创建、就绪、运行、阻塞、终止。

    创建状态:

    在程序中用构造方法创建一个线程对象之后,新的线程对象便处于新建状态。此时,他已经有了相应的内存空间和其他资源,但还处于不可以运行状态。新建一个线程对象可采用Thread类的构造方法实现,例如“Thread thread =new Thread()”。

    就绪状态:

    新建线程对象之后,调用该线程的start()方法就可以启动线程。当启动线程是,线程进入就绪状态。此时,线程将进入线程队列排队,对待CPU服务,这表明他已经具备了运行条件;

    运行状态:

    当就绪的线程被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象的run()方法。Run方法定义了该线程的操作和功能。

    堵塞状态:

    一个宅执行的线程在某些特殊情况下,如果被人为挂或需要执行耗时的输入输出操作时,会让出CPU并暂时中止自己的执行,进入堵塞状态。在可执行的情况下,如果调用sleep()、suspend()、wait()等方法,线程都将进入堵塞状态。堵塞时,线程不能进入排队队列,只有当堵塞的原因被消除之后,线程才可以转入就绪状态。

    死亡状态:

    线程调用stop()方法时或run()方法执行结束后,即处于死亡状态。处于死亡状态的线程不具有继续运行的能力。

    (二)Java IO

    操作文件的类——File

    在整个IO包中,唯一表示与文件本身有关的类就是File类,使用file类可以进行创建或删除文件等常用操作。
    File类的构造方法:

    public File(String pathname )  //实例化File类的时候,必须设置好路径。
    

    创建一个新文件:

    File类实例化之后,就可以使用createNewFile()创建一个新的文件,但是此方法使用了throws关键词,使用在使用中,必须使用try...catch进行异常处理。
    import java.io.File;
    public class File{
    public static void main(String[] args) {
          String path=“d:”+File.separator+”test.txt”;
    		   File f=new File(path);
              try{
                       createNewFile();
          }catch(IOException e){
                           e.printStackTreace();
              }
    } 
    
    通过这个程序之后,在D盘就创建好了一个文件;但是我们需要注意的是,不同操作系统中,路径的分隔符是不同的;
    • 在Windows中使用的是反斜杠表示目录分隔符:“”。
    • 在Linux中使用正斜杠表示目录的分隔符:“/”。

    文件的删除和创建:

    import java.io.File;
    public class File{
    public static void main(String[] args) {
          String path=“d:”+File.separator+”test.txt”;
    		   File f=new File(path);
                    if(f.exists()){
                                f.delete();
                     }else {
                               try{
                                      createNewFile();
                        }catch(IOException e){
                                            e.printStackTreace();
                    }
              }
    }
    
    • 创建文件夹:直接使用mkdir()方法就可以完成。
    import java.io.File;
    public class File{
    public static void main(String[] args) {
          String path=“d:”+File.separator+”test.txt”;
    		   File f=new File(path);
                f.makdir();
            }
    }
    

    一周的学习还是比较有趣的,感觉想到了很多知识,课后用电脑实现了代码,自己创建了,文件,文件夹,删除以及列出文件目录;同时觉得Java学习也越来越难,知识点多起来了就需要去更好的掌握,所以自己还需要更加的努力。

    实验报告:

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

    (1)总票数1000张;
    (2)10个窗口同时开始卖票;
    (3)卖票过程延时1秒钟;
    (4)不能出现一票多卖或卖出负数号票的情况。
    

    实验代码:

    package shyseven;
    
    class Ticket implements Runnable{
    
    	int ticket =1000;
    
    	@Override
    	
    	public void run() {
    
    		while(ticket>0){
    			synchronized(this) {
    				if(ticket>0) {
    					
    					try {
    						Thread.sleep(1000);
    					}catch(InterruptedException e) {
    						e.printStackTrace();
    					}
    					ticket--;
    					System.out.println(Thread.currentThread().getName()+"卖票一张:剩余tickets"+ticket+"张");
    					
    					if(ticket<0) {
    						System.out.println("票已售完");
    					}
    				}
    			}
    		}
    	}
    	
    
    }
    
    package shyseven;
    
    public class Text {
    
    	public static void main(String[] args) {
    		Ticket str=new Ticket();
    		 new Thread(str,"1号窗口").start();
    		 new Thread(str,"2号窗口").start();
             new Thread(str,"3号窗口").start();
    		 new Thread(str,"4号窗口").start();
    		 new Thread(str,"4号窗口").start();
    		 new Thread(str,"5号窗口").start();
    		 new Thread(str,"6号窗口").start();
    		 new Thread(str,"7号窗口").start();
    		 new Thread(str,"8号窗口").start();
    		 new Thread(str,"9号窗口").start();
    		 new Thread(str,"10号窗口").start();
    		 
    	}
    }
    

    这个实验题目不是很难,因为老师上课讲过,完全就是一样的题目,但是我却做了好久好久,原因是起初没有同步,只进行了资源共享,结果出现了有负数的情况,后来结果仔细查找之后,发现了这个问题,解决之后,又发现虽然实现了资源共享却不能实现同步,而这个同步问题很难解决,我进行十个线程同时进行售票,但是结果却一直是只有一个窗口显示卖票,起初是初试类出现了问题,多次改变实例化方法,但是最后还是错了,然后去网上查找之后,复制粘贴代码还是运行不了,最后我按照书本上的代码,经过无数次运行结果终于发现了有两个窗口售票,其它的窗口依旧没有显示,不知道是运行了还是没有运行,也有可能是CPU的原因,因为最后还是出现了两个窗口售票,所以可以肯定的是重新应该没有问题,出现问题的是CPU的选择和分配问题;

  • 相关阅读:
    npm ERR! code EINTEGRITY npm ERR! sha1- 报错解决办法
    create-react-app创建项目报错SyntaxError: Unexpected end of JSON input while parsing near '...ttachment":false,"tar' npm代理
    七大设计原则
    UML类图和时序图
    linux环境下排查cpu占比高的MySQL数据库sql语句
    Angular 2 imooc 学习笔记
    angular JS 学习笔记
    Hibernate HQL基础
    Hibernate注解
    Hibernate多对多映射
  • 原文地址:https://www.cnblogs.com/lyl68/p/11735448.html
Copyright © 2011-2022 走看看