zoukankan      html  css  js  c++  java
  • 0803作业


    多线程作业

    一、填空题
    1.处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入__阻塞_______状态。
    2.处于新建状态的线程被启动后,将进入线程队列排队等待CPU,此时它已具备了运行条件,一旦轮到享用CPU资源就可以获得执行机会。上述线程是处于 就绪 状态。
    3.一个正在执行的线程可能被人为地中断,让出CPU的使用权,暂时中止自己的执行,进入 阻塞 状态。
    4.在Java中编写实现多线程应用有两种途径:一种是继承Thread类创建线程,另一种是实现 runnable 接口创建线程。
    5.在线程控制中,可以调用_____join()_________方法,阻塞当前正在执行的线程,等插队线程执行完后后再执行阻塞线程。
    6.多线程访问某个共享资源可能出现线程安全问题,此时可以使用__synchornized______________关键字来实现线程同步,从而避免安全问题出现,但会影响性能,甚至出现死锁。
    7. 在线程通信中,调用wait( )可以是当前线程处于等待状态,而为了唤醒一个等待的线程,需要调用的方法是___signal()___________。
    8.在线程通信中,可以调用wait()、notify()、notifyAll()三个方法实现线程通信,这三个方法都是___objext___________类提供的public方法,所以任何类都具有这三个方法。

    二、选择题
    1. 下列关于Java线程的说法正确的是( B )。(选择一项)

    A 每一个Java线程可以看成由代码、一个真实的CPU以及数据三部分组成
    B. 创建线程的两种方法中,从Thread类中继承方式可以防止出现多父类的问题
    C. Thread类属于java.util程序包
    D. 使用new Thread(new X()).run();方法启动一个线程

    2. 以下选项中可以填写到横线处,让代码正确编译和运行的是( A )。(选择一项)
    public class Test implements Runnable {
    public static void main(String[] args) {
    ___________________________________
    t.start();
    System.out.println("main");
    }
    public void run() {
    System.out.println("thread1!");
    }
    }

    A. Thread t = new Thread(new Test());
    B. Test t = new Test();
    C. Thread t = new Test();
    D. Thread t = new Thread();

    3. 如下代码创建一个新线程并启动线程,问:四个选项中可以保证正确代码创建target对象,并能编译正确的是( C )?(选择一项)
    public static void main(String[] args) {
    Runnable target=new MyRunnable( );
    Thread myThread=new Thread(target);
    }

    A public class MyRunnable extends Runnable {
    public void run( ) {

    }
    }
    B. public class MyRunnable extends Runnable {
    void run( ) {

    }
    }
    C. public class MyRunnable implements Runnable {
    public void run( ) {

    }
    }
    D. public class MyRunnable implements Runnable {
    void run( ) {

    }
    }

    4. 当线程调用start( )后,其所处状态为(B )。(选择一项)

    A 阻塞状态
    B. 运行状态
    C. 就绪状态
    D. 新建状态

    5. 下列关于Thread类提供的线程控制方法的说法中,错误的是( C )。(选择一项)

    A 线程A中执行线程B的join()方法,则线程A等待直到B执行完成
    B. 线程A通过调用interrupt()方法来中断其阻塞状态
    C. 若线程A调用方法isAlive()返回值为false,则说明A正在执行中,也可能是可运行状态
    D. currentThread()方法返回当前线程的引用

    6. 下列关于线程的优先级说法中,正确的是( AB )。(选择两项)

    A 线程的优先级是不能改变的
    B. 线程的优先级是在创建线程时设置的
    C. 在创建线程后的任何时候都可以重新设置
    D. 线程的优先级的范围在1-100之间

    7. 以下选项中关于Java中线程控制方法的说法正确的是( AB )。(选择二项)

    A. join ( ) 的作用是阻塞指定线程等到另一个线程完成以后再继续执行
    B. sleep ( ) 的作用是让当前正在执行线程暂停,线程将转入就绪状态
    C. yield ( ) 的作用是使线程停止运行一段时间,将处于阻塞状态
    D. setDaemon( )的作用是将指定的线程设置成后台线程

    8. 在多个线程访问同一个资源时,可以使用( A )关键字来实现线程同步,保证对资源安全访问。(选择一项)

    A. synchronized
    B. transient
    C. static
    D. yield

    9. Java中线程安全问题是通过关键字( C )解决的?。(选择一项)

    A. finally
    B. wait( )
    C. synchronized
    D. notify( )
    10. 以下说法中关于线程通信的说法错误的是(C )?。(选择一项)

    A. 可以调用wait()、notify()、notifyAll()三个方法实现线程通信
    B. wait()、notify()、notifyAll()必须在synchronized方法或者代码块中使用
    C. wait()有多个重载的方法,可以指定等待的时间
    D. wait()、notify()、notifyAll()是Object类提供的方法,子类可以重写


    三、简答题
    1.创建线程的两种方式分别是什么?各有什么优缺点。
    第一种是继承Thread 优点是代码量少,缺点是如果已经有了父类,就不能用这个方法
    第二种是实现runnable 优点是不用管定义的线程类有没有父类 .缺点是不能直接使用threa中的方法,代码较复杂
    2.请你简述sleep( )和wait( )有什么区别?
    sleep() 方法中必须有参数设置,能够在参数时间到后自动停止休眠,继续线程运行,不释放锁
    wait() 方法中参数设置可有可无,除非手动解除,否则线程不会再运行,需要释放锁
    3.Java中实现线程通信的三个方法及其作用。
    wait() 让线程等待
    notify() 随机唤醒等待的线程
    notifyAll() 唤醒所有的线程
    四、编码题
    1.设计一个多线程的程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。

    package com.zuikc.thread;
    
    public class Demo7_Ticket {
    /*
     * 用继承的方法
     */
        public static void main(String[] args) {
            //Ticket5 t = new Ticket5();
            new Ticket5().start();
            new Ticket5().start();
            new Ticket5().start();
            new Ticket5().start();
            new Ticket5().start();
            
        }
    
    }
    class Ticket5 extends Thread {
        private static int ticket = 100;
        public void run() {
            while (true) {
                synchronized (Ticket.class) {
                    
                    if (ticket <= 0) {
                        break;
                    }
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        
                        e.printStackTrace();
                    }
                    System.out.println(getName()+"这是第"+(ticket--)+"号票");
                }
            }
        }
    }

    2.编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。打印顺序为12A34B56C….5152Z。即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替循环打印,直到打印到整数52和字母Z结束。
    要求:
    1)编写打印类Printer,声明私有属性index,初始值为1,用来表示是第几次打印。
    2)在打印类Printer中编写打印数字的方法print(int i),3的倍数就使用wait()方法等待,否则就输出i,使用notifyAll()进行唤醒其它线程。
    3)在打印类Printer中编写打印字母的方法print(char c),不是3的倍数就等待,否则就打印输出字母c,使用notifyAll()进行唤醒其它线程。
    4)编写打印数字的线程NumberPrinter继承Thread类,声明私有属性private Printer p;在构造方法中进行赋值,实现父类的run方法,调用Printer类中的输出数字的方法。
    5)编写打印字母的线程LetterPrinter继承Thread类,声明私有属性private Printer p;在构造方法中进行赋值,实现父类的run方法,调用Printer类中的输出字母的方法。
    6)编写测试类Test,创建打印类对象,创建两个线程类对象,启动线程。

    package com.zuikc.thread;
    
    public class Demo8_Test {
    
        public static void main(String[] args) {
            final Printer p = new Printer();
            Thread t1 = new  NumberPrinter(p);
            Thread t2 = new  NumberPrinter(p);
            t1.start();
            t2.start();
        }
    }
    class Printer {
        private int index = 1;
        public void print(int i) throws InterruptedException {
            synchronized (this) {            
                while(index%3==0) {
                    this.wait();
                }
                System.out.println(i);
                index++;
                this.notify();
            }
        }
        public void print(char c)throws InterruptedException {    
            synchronized (this) {            
                while(index%3!=0) {
                    this.wait();
                }
                System.out.println(c);
                index++;
                this.notify();
            }
        }
    }
    class NumberPrinter extends Thread {
        private Printer p;
        public NumberPrinter(Printer p) {
            this.p = p;
        }
        public void run () {
            for (int i = 1; i <= 52; i++) {
                try {
                    p.print(i);
                } catch (InterruptedException e) {
                    
                    e.printStackTrace();
                }
            }
        }
    }
    class LetterPrinter extends Thread {
        private Printer p;
        public LetterPrinter(Printer p) {
            this.p = p;
        }
        public void run () {
            for(char c = 'A';c <= 'z';c++) {
                try {
                    p.print(c);
                } catch (InterruptedException e) {
                    
                    e.printStackTrace();
                }
            }
        }
    }

    五、可选题
    1.设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。
    要求:使用内部类实现线程,对j增减的时候不考虑顺序问题。
    2.编写多线程程序,模拟多个人通过一个山洞的模拟。这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒,有10个人同时准备过此山洞,显示每次通过山洞人的姓名和顺序。

    package com.zuikc.review;
    
    public class Demo1_Test {
    
        public static void main(String[] args) {
            new Person("张一").start();
            new Person("张二").start();
            new Person("张三").start();
            new Person("张四").start();
            new Person("张五").start();
            new Person("张六").start();
            new Person("张七").start();
            new Person("张八").start();
            new Person("张九").start();
            new Person("张十").start();
        }
    
    }
    class Person extends Thread {
        private static int i = 1;
        private String name;
        public Person(){}
        public Person(String name) {
            this.name = name;
        }
        public void run() {
            synchronized (Person.class) {
                
                System.out.println(this.name + "" + (i++) + "个进山洞");
            }
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                
                e.printStackTrace();
            }
        }
        
    }
  • 相关阅读:
    Hibernate框架—简介
    ooad单例模式-Singleton
    About-JavaOOAD
    win10内置ubuntu,mysql完美清理,并安装
    VUE关于对象动态添加属性无法双向绑定问题
    正则留档
    centos下tomcat中文路径不识别
    web服务器解释html-include
    rose
    聊天框突出箭头
  • 原文地址:https://www.cnblogs.com/zhangzheng1989/p/9420189.html
Copyright © 2011-2022 走看看