Java语言程序设计 必实验4 线程应用

实验目的与要求:

    实验目的: 掌握Java程序设计中的线程同步等技术。

实验要求:

(1). 编写Java应用程序实现如下功能:第一个线程生成一个随机数,第二个线程每隔一段时间读取第一个线程生成的随机数,并判断它是否是素数。在报告中附上程序截图、完整的运行结果和简要文字说明。(30分)

(2). 编写Java应用程序实现如下功能:第一个线程输出数字1-52,第二个线程输出字母A-Z,输出的顺序为12A34B56C...5152Z。要求线程间实现通信。在报告中附上程序截图、运行结果和详细的文字说明。(30分)

(3). 编写Java应用程序实现如下功能:创建工作线程,模拟银行现金账户取款操作。多个线程同时执行取款操作时,如果不使用同步处理,会造成账户余额混乱,要求使用syncrhonized关键字同步代码块,以保证多个线程同时执行取款操作时,银行现金账户取款的有效和一致。在报告中附上程序截图、运行结果和详细的文字说明。(40分)

(1). 编写Java应用程序实现如下功能:第一个线程生成一个随机数,第二个线程每隔一段时间读取第一个线程生成的随机数,并判断它是否是素数。在报告中附上程序截图、完整的运行结果和简要文字说明。(30分)

设计:为了线程安全,采用LinkedBlockingQueue链式阻塞队列作为缓冲区,实现PrimeGen类和PrimeChecker

package Hw8;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
import java.util.Timer;
import java.util.concurrent.LinkedBlockingQueue;

class PrimeGen extends Thread {
    public Random random = new Random();
    public LinkedBlockingQueue<Integer> lbq;

    PrimeGen(LinkedBlockingQueue<Integer> lbq) {
        this.lbq = lbq;
    }

    @Override
    public void run() {
        try {
            while (true) {
                int temp = random.nextInt() % 1000;
                if (temp < 0) {
                    temp = -temp;
                }
                lbq.put(temp);
            }
        } catch (Exception e) {
            System.out.println("PrimeGen终止");
        }
    }
}

class PrimeChecker extends Thread {
    public LinkedBlockingQueue<Integer> lbq;

    PrimeChecker(LinkedBlockingQueue<Integer> lbq) {
        this.lbq = lbq;
    }

    public boolean isPrime(int temp) {
        for (int i = 2; i < temp; i++) {
            if (temp % i == 0) {
                return false;
            }
        }
        return true;
    }

    @Override
    public void run() {
        try {
            while (true) {
                Integer temp = lbq.take();
                if (isPrime(temp)) {
                    System.out.println(temp + "是质数");
                }
            }
        } catch (Exception e) {
            System.out.println("PrimeChecker终止");
        }
    }
}

public class PrimeTest {
    public static void main(String[] args) throws InterruptedException {
        LinkedBlockingQueue<Integer> lbq = new LinkedBlockingQueue<>();
        PrimeGen primeGen = new PrimeGen(lbq);
        PrimeChecker primeChecker = new PrimeChecker(lbq);
        primeGen.start();
        primeChecker.start();
        try {
            Thread.sleep(100);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        primeGen.interrupt();
        primeChecker.interrupt();

    }
}

 

(2). 编写Java应用程序实现如下功能:第一个线程输出数字1-52,第二个线程输出字母A-Z,输出的顺序为12A34B56C...5152Z。要求线程间实现通信。在报告中附上程序截图、运行结果和详细的文字说明。(30分)

设计:采用锁的思想,第一个线程执行两次的时候就释挂起并且唤醒其他线程,第二个线程同理

package Hw8;

import java.io.ObjectStreamException;

public class Sem {
    public static void main(String[] args) {
        Object lock = new Object();
        NumGen numGen = new NumGen(lock);
        CharGen charGen = new CharGen(lock);
        new Thread(numGen,"numGen").start();
        new Thread(charGen,"charGen").start();
    }
}

class NumGen implements Runnable{
    Object lock;
    int cnt = 0;
    NumGen(Object lock){
        this.lock = lock;
    }
    @Override
    public void run(){
        synchronized (lock){
            while(true){
                cnt++;
                System.out.print(cnt);
                cnt++;
                System.out.print(cnt);
                if(cnt==52){
                    lock.notifyAll();
                    break;
                }
                lock.notifyAll();
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

class CharGen implements Runnable{
    Object lock;
    char aChar = 'A';
    CharGen(Object lock){
        this.lock = lock;
    }
    @Override
    public void run(){
        synchronized (lock){
            while(true){
                System.out.print(aChar);
                if(aChar=='Z'){
                    break;
                }
                aChar++;
                lock.notifyAll();
                try {
                    lock.wait();
                }catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

 

(3). 编写Java应用程序实现如下功能:创建工作线程,模拟银行现金账户取款操作。多个线程同时执行取款操作时,如果不使用同步处理,会造成账户余额混乱,要求使用syncrhonized关键字同步代码块,以保证多个线程同时执行取款操作时,银行现金账户取款的有效和一致。在报告中附上程序截图、运行结果和详细的文字说明。(40分)

设计:通过给取钱动作加锁,来实现线程同步
 

package Hw8;

public class Bank {
    int total;
    Bank(){
        total = 10000;
    }

    public boolean isEmpty(){
        return total <= 0;
    }
    public synchronized void take(){
        if(total>100){
            total-=100;
            System.out.println("现在的余额是"+total);
        }
        else{
            total = 0;
            System.out.println("别取拉!要没钱拉!");
        }
    }
    public static void main(String[] args) {
        Bank bank = new Bank();
        User[] users = new User[8];
        for (User user : users) {
            user = new User(bank);
            new Thread(user).start();
        }
    }
}

class User implements Runnable{
    Bank bank;
    User(Bank bank){
        this.bank = bank;
    }

    @Override
    public void run(){
        while (!bank.isEmpty()) {
            bank.take();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验Java 语言基础 1 一. 实验目的 1 二.实验内容 1 三.源程序代码 1 四.实验结果截图 6 五.结果分析 7 实验二 面向对象程序设计 8 一.实验目的 8 二.实验内容 8 三.源程序代码 8 四.实验结果截图 12 五.结果分析 13 实验三、异常处理程序设计 14 一.实验目的 14 二.实验内容 14 三.源程序代码 14 四.实验结果 17 五.结果分析 18 实验四 图形用户界面程序设计 19 一.实验目的 19 二.实验内容: 19 三.源程序代码(核心代码) 19 四.程序设计思路 23 五.实验结果及分析 23 六.不足之处 26 实验五 多线程程序设计 27 一.实验目的 27 二.实验内容 27 三.源程序代码 27 四.实验结果截图 29 五.结果分析 30 实验六 输入输出流 31 一.实验目的 31 二.实验内容: 31 三.源程序代码 31 四.实验结果截图 36 五.结果分析 37 实验七 使用 TCP 协议的 Socket 网络程序设计 38 一.实验目的 38 二.实验内容 38 三.核心源代码 39 四.实验结果截图 43 五.结果分析 45 实验八 数据库应用 46 一.实验目的 46 二.实验内容 46 三.源程序代码 46 四.实验结果截图 48 五.结果分析 48 附录一:学生信息管理(针对实验四文件操作的改进) 49 一. 目前界面 49 二. 改进展示 50 三. 部分代码 53 四. 总结 54 附录二:多对多聊天室(实验七扩展) 55 一. 思路 55 二. 核心代码 55 三. 截屏展示 58 四. 实验分析 60
JAVA语言程序设计》课程教学大纲 一、课程基本信息 课程代码: 课程名称:JAVA语言程序设计 课程性质:专业课 课程类型:修课 计划学时:72 计划学分:4 适用专业:计算机软件 先修课程:计算机基础 编制时间:2006-7-6 二、课程性质和任务 性质:《JAVA语言程序设计》是一门以面向对象程序设计为主干线,深入浅出地介绍Java 基本概念、基本方法及技巧、Java虚拟机和Java的各种实用技术的书。 任务:培养学生用JAVA语言编写程序的能力。 三、课程特色 本课程以课堂授课和多媒体教学并行的方式,让学生在理论的指引下,辅以上机实 操练习。 四、知识能力培养 (一)基本知识 类与对象及相关的概念,Java图形编程,事件响应,多线程编程和数据库编程等。 (二)自学能力 通过本课程的学习,要求学生掌握JAVA语言编程的规范和思想,并具备编写小型程 序的能力。 五、课程内容和要求 "序"课程内容 "教 学 要 求 " "号" " " " " "理论知识 "实验能"学"作"实"实" " " " "力 "时"业"验"训" " " "了解 " " " "理论知识 "实验能"学"作"实"实" " " " "力 "时"业"验"训" " " "了解 " "一、JAVA语言概述 "2学时 "2学时 " "二、JAVA基础 "4学时 "2学时 " "三、JAVA流程控制 "6学时 "2学时 " "四、方法 "2学时 "2学时 " "五、数组 "4学时 " " "六、面向对象的程序设计 "6学时 "4学时 " "概念 " " " "七、类的封装,多态和继 "4学时 "2学时 " "承 " " " "八、接口和包 "4学时 "2学时 " "九、异常处理 "4学时 " " "十、输入与输出 "6学时 "2学时 " "十一、图形用户界面 "6学时 "4学时 " "十二、APPLET程序 "4学时 "2学时 " "十三、数据库编程 "8学时 "6学时 " 1. 教学方法 1. 该课程实践性较强,需要学生多作练习。 2. 教师需要有比较熟练的编程经验,对JDK比较熟悉。 2. 课程考核要求 1.考核内容及所占比重 考核内容主要包括平时作业成绩、实验成绩以及课程结束时的综合考试成绩进行综 合评定;各部分所占比重如下: 作业成绩:实验成绩:期终考试成绩=2:3:5 2.考核办法 闭卷考试。 3. 选用教材及参考书 教材: 《Java语言程序设计》,李尊朝,苏军主编,中国铁道出版社。 参考书: 1.朱喜福,《Java网络应用编程入门》,人民邮电出版社。 2.梁锦叶,《Java语言应用教程》,人民邮电出版社。 八、大纲说明 本大纲适用于计算机应用专业及相关专业学生于第二学年的第二学期使用。 《Java语言程序设计》实践教学大纲 一、实践性质、目的与任务 本实践教学是《Java语言程序设计》课程教学的重要组成部分,其任务是: (1)培养学生用面向对象程序设计思想设计程序的能力; (2)使学生掌握类的构造与设计方法; (3)使学生掌握继承与派生类的方法; (4)使学生了解多态的使用方法; (5)掌握接口的定义与使用方法 (6)使学生掌握用J2sdk开发程序的方法。 二、实践教学目标 Java语言是面向对象程序设计语言之一,它对面向对象的基本特征都有很好的支持 ,掌握Java面向对象特征,并能熟练利用Java语言编写程序。为今后的面向对象程 序开发打下基础。 通过系统地上机练习,力求使学生能够达到以下目标: (1)加深学生对课堂讲授内容的理解,从计算机语言的基本概念、面向对象程序设 计的基本方法、语法规则等方面加深理解,打好面向对象程序设计开发软件的良 好基础。 (2)在上机实验中,提高学生对Java语言各部分内容的综合使用能力,逐步掌握J ava语言程序设计的规律与技巧。 (3)在对Java程序的调试过程中,提高学生分析程序中出现的错误和排除这些错误 的能力。 (4)通过上机实践,加深学生对计算机软件运行环境,以及对操作系统与计算机语 言支持系统相互关系的了解。 三、实践内容 实验Java编程环境与基本语法 1.实验的基本内容 (1)JDK安装,配置环境变量path与classpath。 (2)java应用程序编写。 (3)java语言基础 2.实验的基本要求 (1)熟悉Java语言开发和运行环境,试写程序源文件,运行所写的程序。 (2)掌握变量定义与数据类型;掌握算术运算;掌握关系运算与逻辑运算.。 (3)掌握if语句,if-else语句;循环语句;掌握switch语句的使用。 (4)掌握数组的定义与使用。 实验二 面向对象基础 1.实验的基本内容 (1)定义类包括成员变量,构造函数,成员方法,并调用构造函数创建对象。 (2)理解成员变量的继承与隐藏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值