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

    课程总结:

    多线程:Java中编程实现多线程应有两种途径:一种是创建用户自己的Thread线程子类,另一种是在用户自己的类中实现Runnable接口。

    1.Thread类:

    Thread类是一个具体的类,该类封装了线程的属性和行为。
    Thread类的构造函数有多个,比较常用的有如下几个。

    (1)public Thread();
    这个方法创建了一个默认的线程类对象。
    (2)public Thread(Runnable target);
    这个方法在上一个构造函数的基础上,利用一个实现了Runnable接口参数对象Target中所定义的run()方法,以便初始化或覆盖新创建的线程对象的run()方法。
    (3)public Thread(String name);
    

    Thread类的主要方法如下:
    (1)启动线程的Start()方法:public void start()。
    (2)定义线程操作的run()方法:public void run()。
    (3)使线程暂时休眠的sleep()方法:
    public static void sleep(long millis) throws InterruptedException1
    (4)终止线程的方法stop():
    public final void stop()
    public final void stop(Throwable obj)

    .class<类名> extends thread{
    public void run(){
    //线程所要执行任务的代码
    }
    }
    

    2.Runnable接口:

    定义Runnable接口的实现类,并重写其中的run方法。run()方法的方法体是线程执行体。

    .class<类名>  implement Runnable{
      public void run(){
    //线程所要执行任务的代码
      }
     }
    
    注意:Thread有单继承的问题;Runnable便于实现资源共享,而Thread不能;
    

    线程的状态:

    1.创建状态

    当用new操作符创建一个线程时。此时程序还没有开始运行线程中的代码。

    2.就绪状态

    一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。

    3.运行状态

    当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法。

    4.阻塞状态

    线程运行过程中,可能由于各种原因进入阻塞状态:
    ①线程通过调用sleep方法进入睡眠状态;
    ②线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
    ③线程试图得到一个锁,而该锁正被其他线程持有;
    ④线程在等待某个触发条件;
    所谓阻塞状态是正在运行的线程没有运行结束,暂时让出CPU,这时其他处于就绪状态的线程就可以获得CPU时间,进入运行状态。

    5.死亡状态

    有两个原因会导致线程死亡:
    ①run方法或stop方法正常退出而自然死亡;
    ②一个未捕获的异常终止了run方法而使线程猝死;

    实验报告

    1.完成火车站售票程序的模拟。

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

    源码1:

    package shiyan7;
    
    public class Maipiao implements Runnable{
    	private 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()+":售票一张:剩余"+ticket+"张票");
                        
                        if(ticket==0) {
                            System.out.println("票已售完");
                        }
                    }
                }
            }
        }
    }
    
    package shiyan7;
    
    public class Text {
    	public static void main(String[] args) {
            Maipiao mp=new Maipiao();
            Thread ck1 = new Thread(mp, "窗口1");
            Thread ck2 = new Thread(mp, "窗口2");
            Thread ck3 = new Thread(mp, "窗口3");
            Thread ck4 = new Thread(mp, "窗口4");
            Thread ck5 = new Thread(mp, "窗口5");
            Thread ck6 = new Thread(mp, "窗口6");
            Thread ck7 = new Thread(mp, "窗口7");
            Thread ck8 = new Thread(mp, "窗口8");
            Thread ck9 = new Thread(mp, "窗口9");
            Thread ck10 = new Thread(mp, "窗口10");
    
            ck1.start();
            ck2.start();
            ck3.start();
            ck4.start();
            ck5.start();
            ck6.start();
            ck7.start();
            ck8.start();
            ck9.start();
            ck10.start();
        }
    }
    

    截图1:


    (遇到的问题:窗口重复的太多,票也很多,暂时没找到解决的办法)

  • 相关阅读:
    JAVA 问题
    WebStrom配置多个项目的Dweployment时,设置默认的启动配置
    C#中有关数组和string引用类型或值类型的判断
    Delegate(代理)异常:该委托必须有一个目标
    RMAN BACKUP
    Oracle ORA-01033: 错误解决办法
    微信公众号开发 接口配置信息 配置失败
    使用JAVA开发微信公众平台(一)——环境搭建与开发接入
    微信开发准备(四)--nat123内网地址公网映射实现
    nat123安装启动教程帮助
  • 原文地址:https://www.cnblogs.com/leichen210/p/11737534.html
Copyright © 2011-2022 走看看