目录

  • Java开发入门
    • ● Java 概述
    • ● JDK的使用
    • ● 系统环境变量
    • ● 第一个Java程序
    • ● Java的运行机制
    • ● 教学设计
    • ● 课程讲义
    • ● 案例学习
    • ● 课后题答案
  • Java 编程基础
    • ● Java的基本语法
      • ● Java代码基本格式
      • ● Java中的注释
      • ● Java中的关键字
      • ● Java中的标识符
    • ● Java中的变量与常量
      • ● 变量的定义
      • ● 变量的数据类型
        • ● 案例导学
      • ● 变量的类型转换
        • ● 案例导学-自动类型转换
        • ● 案例导学-强制类型转换
      • ● 变量的作用域
        • ● 案例导学-作用域
      • ● Java中的常量
    • ● Java中的运算符
      • ● 案例导学-算术运算符
      • ● 案例导学-赋值运算符
      • ● 案例导学-比较运算符
      • ● 案例导学-逻辑运算符
      • ● 案例导学-位运算符
      • ● 案例导学-运算符的优先级
    • ● 选择结构语句
      • ● 案例导学-if条件语句
      • ● 案例导学-switch条件语句
    • ● 循环结构语句
      • ● 案例导学-while循环语句
      • ● 案例导学-for循环语句
      • ● 案例导学-循环嵌套
      • ● 案例导学-break语句
      • ● 案例导学-continue语句
    • ● 数组
      • ● 案例导学-一维数组的定义
      • ● 案例导学-数组最值
      • ● 案例导学-数组排序
    • ● 教学设计
    • ● 课程讲义
    • ● 课后题答案
  • 面向对象(上)
    • ● 面向对象概述
    • ● Java中的类与对象
      • ● 案例导学-类与对象
    • ● 类的封装
    • ● 案例导学-类的封装
    • ● 方法的重载和递归
    • ● 构造方法
      • ● 案例导学-构造方法与重载
    • ● this关键字
      • ● 案例导学-this
    • ● static关键字
      • ● 案例导学-静态变量
      • ● 案例导学-静态方法
      • ● 案例导学-静态代码块
    • ● 教学设计
    • ● 课程讲义
    • ● 章节测试
    • ● 课后题答案
  • 面向对象(下)
    • ● 类的继承
      • ● 案例导学-类的继承
      • ● 案例导学-方法的重写
      • ● 案例导学-super访问父类成员变量
      • ● 案例导学-super访问父类成员方法
      • ● 案例导学-super访问父类构造方法
    • ● final关键字
    • ● 抽象类和接口
    • ● 多态
    • ● 内部类
    • ● JDK8的Lambda表达式
    • ● 异常
    • ● 垃圾回收
    • ● 教学设计
    • ● 课程讲义
    • ● 章节测试
    • ● 课后习题答案
  • Java中的常用类
    • ● String类和StringBuffer类
    • ● System类与Runtime类
    • ● Math类与Random类
    • ● 包装类
    • ● 日期与时间类
    • ● 格式化类
    • ● 课后题答案
    • ● 课程讲义
  • 集合
    • ● 集和概述
    • ● Collection接口
    • ● List接口
      • ● List接口简介
      • ● ArrayList集合
      • ● LinkList集合
    • ● Collection集合遍历
    • ● Set接口
    • ● Map接口
    • ● 泛型
    • ● 常用工具类
      • ● Collections工具类
      • ● Arrays工具类
    • ● 课后题参考答案
    • ● 课程讲义
  • IO流
    • ● I/O流概述
    • ● 字节流
    • ● 字符流
    • ● File类
    • ● RandomAccessFile
    • ● 对象序列化
    • ● NIO
    • ● NIO.2
    • ● 课后题答案
    • ● 课程讲义
    • ● 章节测试
  • GUI(图形用户接口)
    • ● Swing概述
    • ● Swing顶级容器
    • ● 布局管理器
    • ● 事件处理
    • ● Swing常用组件
    • ● Swing组件的整合使用
    • ● JavaFX图形用户界面工具
    • ● 课程讲义
  • JDBC
    • ● 什么是JDBC
    • ● JDBC常用API
    • ● JDBC编程
    • ● 案例-使用JDBC实现QQ登录
    • ● 课程讲义
  • 多线程
    • ● 线程概述
    • ● 线程的创建
    • ● 线程的生命周期及状态转换
    • ● 线程的调度
    • ● 多线程同步
    • ● 多线程通信
    • ● 教学设计
    • ● 课后题参考答案
    • ● 课程讲义
  • 网络编程
    • ● 网络通信协议
    • ● UDP通信
    • ● TCP通信
    • ● 课程讲义
  • Eclipse开发工具
    • ● Eclipse概述
    • ● Eclipse的安装与启动
    • ● Eclipse进行程序开发
    • ● Eclipse程序调试
    • ● 使用Eclipse导出、导入jar文件
  • ACM大赛题库
    • ● 2027
    • ● 2028
    • ● 2024-2026
    • ● 2012-2023
    • ● 2018-2020
    • ● 2015-2017
    • ● 2012-2014
    • ● 2009-2011
    • ● 2003-2005
    • ● 2000-2002
  • PBL学生风采展示
    • ● 实验一
    • ● 实验二
    • ● 实验三
    • ● 实验四
课后题参考答案

一、填空题

1 线程、通信

2 ThreadRunnable

3就绪

4 synchronized、对象、this

5进程

6新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、死亡状态(Terminated)

7101

8开启一个新线程、run()方法

9wait()notify()notifyAll()

10setDaemon(true)start()

二、判断题

1、错   2、对  3、对   4、错   5、错

三、选择题

1B   2AC   3ABC   4BC   5ABD   6ABC   7C   8D   9AB   10ABCD

四、程序分析题

1、程序不能编译通过,因为RunHandler类没有实现Runnable接口,因此RunHandler的实例对象不能作为参数传递给Thread的构造方法。

2、程序不能编译通过,因为Thread的子类A重写的run()方法的访问级别不能低于父类run()方法的。访问级别

3、程序不能编译通过,因为同步方法中调用wait()方法的对象必须为同步锁对象。

4t.start();

五、简答题

1一种是继承java.lang包下的Thread类,覆写Thread类的run()方法,在run()方法中实现运行在线程上的代码。

new Thread() {

    publicvoid run(){}

}.start();

另一种就是实现java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码。

new Thread(new Runnable(){

     publicvoid run(){}

}).start()

1、 调用sleep()方法,正在执行的线程主动让出CPU去执行其他线程,在sleep()方法指定的时间过后,CPU才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep()方法并不会释放锁,即使当前线程使用sleep()方法让出了CPU,但其它被同步锁挡住了的线程也无法得到执行。wait()在一个已经进入了同步锁的线程内进行调用,让当前线程暂时让出同步锁,以便其它正在等待此锁的线程可以得到同步锁并运行。当其它线程调用了notify()方法后,调用wait()方法的线程就会解除wait状态,当再次获得同步锁后,程序可以继续向下执行。

2、  相同点:Lock能完成synchronized所实现的所有功能。

不同点:总的来说,Lock更加灵活。Lock有比synchronized更精确的线程予以和更好的性能。synchronized会自动释放锁,但是Lock一定要求程序员手工释放,并且必须在finally从句中释放。synchronized 修饰方法时表示同一个对象在不同的线程中表现为同步队列,如果实例化不同的对象,那么synchronized就不会出现同步效果了。

  4、在一个操作系统中,每个独立执行的程序都可以称为一个进程,也就是“正在运行的程序”。而在进程中还可以有多个执行单元同时执行,这些执行单元可以看作程序执行的一条条线索,被称为线程。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。

 

六、编程题

1、参考答案

public class MyThread extends Thread{

    publicMyThread(String name) {

         super(name);      

    }

    public voidrun() {

       System.out.println(this.getName());

    }

    public staticvoid main(String[] args) {

        newMyThread("Thread1").start();

        newMyThread("Thread2").start();

    }

}  

2参考答案

public class MyRunnable implements Runnable {

    public voidrun() {

        for (inti = 0; i < 50; i++) {

            System.out.println("new");

        }

    }

    public staticvoid main(String[] args) {

        newThread(new MyRunnable()).start();

        for (inti = 0; i < 100; i++) {

            System.out.println("main");

        }

    }

}

3参考答案

public class Test01 {

    public staticvoid main(String[] args) {

        Teachert = new Teacher();

        newThread(t, "陈老师").start();

        newThread(t, "高老师").start();

        newThread(t, "李老师").start();

    }

}

class Teacher implements Runnable {

    private intnotes = 80;

    public voidrun() {

        while(true) {

            dispatchNotes();// 调用售票方法

            if(notes <= 0) {

                break;

            }

        }

    }

    private synchronizedvoid dispatchNotes() {

        if(notes > 0) {

            try{

                Thread.sleep(10);// 经过的线程休眠10毫秒

            } catch(InterruptedException e) {

                e.printStackTrace();

            }

            System.out.println(Thread.currentThread().getName()+ "---发出的笔记"

                    +notes--);

        }

    }

}

4参考答案

public class Accumulator extends Thread {

    privateint stratNum;

    publicstatic int sum;

    publicAccumulator(int startNum) {

        this.stratNum= startNum;

    }

    publicstatic synchronized void add(int num) {

        sum +=num;

    }

    publicvoid run() {

        intsum = 0;

        for(int i = 0; i < 10; i++) {

            sum+= stratNum + i;

        }

        add(sum);

    }

    publicstatic void main(String[] args) throws Exception {

        Thread[]threadList = new Thread[10];

        for(int i = 0; i < 10; i++) {

            threadList[i]= new Accumulator(10 * i + 1);

            threadList[i].start();

        }

        for(int i = 0; i < 10; i++) {

            threadList[i].join();

        }

        System.out.println("Sumis : " + sum);

    }

}