实验10 多线程的实验.docx

上传人:b****9 文档编号:26394552 上传时间:2023-06-18 格式:DOCX 页数:18 大小:104.92KB
下载 相关 举报
实验10 多线程的实验.docx_第1页
第1页 / 共18页
实验10 多线程的实验.docx_第2页
第2页 / 共18页
实验10 多线程的实验.docx_第3页
第3页 / 共18页
实验10 多线程的实验.docx_第4页
第4页 / 共18页
实验10 多线程的实验.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验10 多线程的实验.docx

《实验10 多线程的实验.docx》由会员分享,可在线阅读,更多相关《实验10 多线程的实验.docx(18页珍藏版)》请在冰豆网上搜索。

实验10 多线程的实验.docx

实验10多线程的实验

深圳大学实验报告

课程名称:

JAVA程序设计

实验项目名称:

实验十多线程的实验

学院:

管理学院

专业:

信息管理与信息系统

指导教师:

林少聪

报告人:

杨立滨学号:

2014040329班级:

信管01

实验时间:

2017年12月25日星期一

实验报告提交时间:

2017年12月25日星期一

 

一、实验目的与要求:

1、熟悉线程的概念

2、掌握建立线程的两种方法:

继承Thread类、实现Runnable接口。

3、熟悉线程的主要方法:

sleep(n)、interrupt()等。

二、实验内容

1.本题必须在课堂上完成:

(30分)

1)(10分)建立一个线程,其任务是每隔1s生成一个随机数,共生成50个;要求分别使用以下方法:

①继承Thread类

实现Runnable接口的方法

2)(10分)建立两个线程,线程T1的内部变量n初始值为10,它每隔一秒递减1;线程T2的内部变量n初始值为0,它每隔一秒递增1;主线程负责判断,当两线程的n相等时,输出信息“Theymeet!

”,然后使用System.exit(0)方法结束整个程序。

3)(10分)简单说明一下,继承Thread的方法建立线程与实现Runnable接口建立线程,这两种方法的特点,以及如何决定选择哪一种方法?

 

2.classAccount

Account

说明

-accountNum:

int

该账户的账号,8位数字,形如”80000001”,满足每增加一个用户,账户加1

-name:

String

该账户的客户名,只包含英文字符,形如“zhang12”、”&zhang”等为非法

idNum:

String

身份证号码,18位的数字字符串,形如”440501200009205686”为合法

-birthday:

Date

出生日期,不需要用户输入,取身份证号码的红色部分:

2000/9/20

-balance:

doube

账户当前余额,必须是大于等于0的数字

-password:

string

用户密码,位数大于8的字符串,必须包含数字和字母,“12345678”、“chenxiao”为非法,“sd2233jr”合法

-sex:

String

性别,只能输入“男”或“女”

建立以下三个类:

classAccountList、classSalary、classElectricFee、classTest

classAccountList:

在类中定义一个ArrayList成员,用于存放账户的数组。

classSalary:

该类实现Runnable接口,线程的功能是向AccountList数组中的100个账户发放500~1000元之间的随机数目的工资,每发放一个工资,就休眠1秒,将发放工资的状况即时输出在“发放工资”窗口中,其信息列表的格式大致如下:

发放工资:

姓名账户原有金额工资金额余额

张三80000001123500623

李四800000025006001100

……….

classElectricFee:

该类实现Runnable接口,线程的功能是向AccountList数组中的100个账户收取300元的水电费,每收取一个账户的水电费,就休眠1秒,将收取水电费的过程状况即时输出在“收取水电费”窗口中,其信息列表的格式大致如下:

收取水电费:

姓名账户原有金额电费金额余额

张三80000001623300323

李四800000021100300800

……….

 

classTest:

1、向ArrayList数组输入100个账户的信息,账户的各项信息都可以随机生成,其金额是随机的100到200之间的随机数;

2、然后生成Salary、ElectricFee两个线程对象,同时运行这两个线程,模仿发工资与收取水电费同时进行的情况,观察一下两个窗口中输出的信息。

三、实验过程及结果

第一题

(1)代码如下:

继承Thread

packagecom.bingo.test;

publicclassDemo1_1{

publicstaticvoidmain(String[]args){

Createnumtag=newCreatenum();

tag.start();

}

}

classCreatenumextendsThread{

privateintnum;

publicvoidrun(){

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

{

num=(int)(Math.random()*100);

System.out.println("第"+(i+1)+"个随机数:

"+num);

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){}

}

}

}

实现Runnable接口:

packagecom.bingo.test;

publicclassDemo1_1{

publicstaticvoidmain(String[]args){

Createtag=newCreate();

Threadth=newThread(tag);

th.start();

}

}

classCreateimplementsRunnable{

privateintnum;

publicvoidrun(){

System.out.println("实现Runnable接口:

");

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

{

num=(int)(Math.random()*100);

System.out.println("第"+(i+1)+"个随机数:

"+num);

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){}

}

}

}

运行效果截图如下:

(2)代码如下:

packagecom.bingo.test;

publicclassDemo2{

publicstaticvoidmain(String[]args){

Addth1=newAdd(0);

Subtractth2=newSubtract(th1,10);

th1.start();

th2.start();

}

}

classAddextendsThread{

privateintan;

Add(intan){

this.an=an;

}

publicintgetan(){

returnan;

}

publicvoidrun(){

while(true){

try{

an++;

System.out.println("加法中的n="+an);

Thread.sleep(1000);

}catch(InterruptedExceptione){}

}

}

}

classSubtractextendsThread{

privateintsn;

privateAddth1;

Subtract(Addth1,intsn){

this.th1=th1;

this.sn=sn;

}

publicintgetsn(){

returnsn;

}

publicvoidrun(){

while(true){

try{

sn--;

System.out.println("减法中的n="+sn);

if(sn==th1.getan()){

System.out.println("Theyaremeet!

");

System.exit(0);

}

Thread.sleep(1000);

}catch(InterruptedExceptione){}

}

}

}

运行效果截图如下:

(3)说明何时使用继承Thread的方法,何时使用实现Runnable接口的方法。

1)继承Thread的方法建立线程的方法比较简单直观,该类可以直接使用从Thread继承下来的方法,当不需要该线程类作为其他类的子类,用此种方法比较方便,但该不可以再继承其他类。

2)实现Runnable接口建立线程,则比较灵活也更常用,因为该类以后可以继承其他类,可以弥补java单继承的缺点。

第二题

代码如下:

packagecom.bingo.test;

importjava.awt.BorderLayout;

importjava.awt.GridLayout;

importjava.text.ParseException;

importjava.text.SimpleDateFormat;

importjava.util.ArrayList;

importjava.util.Date;

importjava.util.Iterator;

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

importjavax.swing.JFrame;

importjavax.swing.JLabel;

importjavax.swing.JPanel;

importjavax.swing.JScrollPane;

importjavax.swing.JTextArea;

publicclassTest{

publicstaticvoidmain(String[]args){

AccountListA=newAccountList();

//创建100个账户信息

intaccountNum=0;

for(inti=0;i<8;i++)

accountNum+=((int)(Math.random()*9)+accountNum*10);

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

Accounta=newAccount(accountNum++);

a.setName();

a.setIdNum();

try{

a.setDate();

}catch(Exceptione){}

a.setBalance();

a.setSex();

a.setPassword();

A.add(a);

}

//创建两个进程

ThreadS=newThread(newSalary(A));

ThreadE=newThread(newElectricFee(A));

S.start();

E.start();

}

}

classSalaryimplementsRunnable{

privateAccountLista;

Salary(AccountLista){

this.a=a;

}

publicvoidrun(){

//先创建发放工资窗口

JFramegiveFrame=newJFrame("发放工资");

giveFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanellistpaneS=newJPanel(newBorderLayout());

JTextAreaTextAreaS=newJTextArea(5,10);

JPanelpaneS1=newJPanel(newGridLayout(1,5,1,1));

JPanelpaneS2=newJPanel(newBorderLayout());

paneS1.add(newJLabel("姓名"));

paneS1.add(newJLabel("账户"));

paneS1.add(newJLabel("原有余额"));

paneS1.add(newJLabel("工资金额"));

paneS1.add(newJLabel("余额"));

paneS2.add(newJScrollPane(TextAreaS),BorderLayout.CENTER);

listpaneS.add(paneS2,BorderLayout.CENTER);

listpaneS.add(paneS1,BorderLayout.NORTH);

giveFrame.add(listpaneS);

giveFrame.setSize(350,150);

giveFrame.setVisible(true);

Iteratorit=a.getArrayList().iterator();

while(it.hasNext()){

TextAreaS.setText(TextAreaS.getText()+a.Give(it.next())+"\n");

}

}

}

classElectricFeeimplementsRunnable{

privateAccountLista;

ElectricFee(AccountLista){

this.a=a;

}

publicvoidrun(){

//先创建窗口

JFrametakeFrame=newJFrame("收取水电费");

takeFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanellistpaneE=newJPanel(newBorderLayout());

JPanelpaneE1=newJPanel(newGridLayout(1,5,1,1));

JTextAreaTextAreaE=newJTextArea(5,10);

JPanelpaneE2=newJPanel(newBorderLayout());

paneE1.add(newJLabel("姓名"));

paneE1.add(newJLabel("账户"));

paneE1.add(newJLabel("原有余额"));

paneE1.add(newJLabel("电费金额"));

paneE1.add(newJLabel("余额"));

paneE2.add(newJScrollPane(TextAreaE),BorderLayout.CENTER);

listpaneE.add(paneE1,BorderLayout.NORTH);

listpaneE.add(paneE2,BorderLayout.CENTER);

takeFrame.add(listpaneE);

takeFrame.setSize(350,150);

takeFrame.setVisible(true);

Iteratorit=a.getArrayList().iterator();

while(it.hasNext()){

TextAreaE.setText(TextAreaE.getText()+a.Take(it.next())+"\n");

}

}

}

classAccountList{

privateArrayListAL;

AccountList(){

AL=newArrayList();

}

publicvoidadd(Accounta){

AL.add(a);

}

publicArrayListgetArrayList(){

returnAL;

}

publicsynchronizedStringGive(Accounta){

Accounttemp=a;

Stringstrtemp=temp.toString();//先初始化列表每一行前面原始数据

intnum=(int)(Math.random()*500+500);

temp.changeBalance(num);

strtemp+=(num+""+a.getBalnace());

try{Thread.sleep(1000);}catch(InterruptedExceptione){}

returnstrtemp;

}

publicsynchronizedStringTake(Accounta){

Accounttemp=a;

doublenum=-300;

while(a.getBalnace()<(-num)){

try{wait();}catch(InterruptedExceptione){}

}

notify();

Stringstrtemp=temp.toString();//先初始化列表每一行前面原始数据

temp.changeBalance(num);

strtemp+=((-num)+""+a.getBalnace());

try{Thread.sleep(1000);}catch(InterruptedExceptione){}

returnstrtemp;

}

}

classAccount{

privateintaccountNum;

privateStringname="";

privateStringidNum="";

privateDatebirthday;

privatedoublebalance;

privateStringpassword="";

privateStringsex="";

publicAccount(){}

publicAccount(intaccount){

this.accountNum=account;

}

voidsetName(){

inti;

charup,low;//名字里面有随机大小写

intname_num=(int)(Math.random()*3+2);//名字长度在2-5位以内,可以修改,

for(i=0;i

{

intt=(int)(Math.random()*2);//随机产生01

if(t==0){

up=(char)(Math.random()*26+'A');

name+=up;

}

else{

low=(char)(Math.random()*26+'a');

name+=low;

}

}

}

//设置身份证号码

voidsetIdNum(){

inti,num;

for(i=0;i<6;i++){

num=(int)(Math.random()*9);//身份证前6位随机数字

idNum+=num;

}

//接着年份,初始值1900至2017

num=(int)(Math.random()*117);

idNum+=(1900+num);

//接着月份,

num=(int)(Math.random()*12+1);

if(num<10)

idNum+=("0"+num);

else

idNum+=num;

//接着日期

num=(int)(Math.random()*31+1);//假定一个月都是31天

if(num<10)

idNum+=("0"+num);

else

idNum+=num;

//最后随机生成四位数

num=(int)(Math.random()*9999);

idNum+=num;

}

voidsetBalance(){

balance=(int)(Math.random()*100+100);

}

voidsetPassword(){

inti;

charup,low;

intnumber;//密码随机数字,大小写字母

intpass_num=(int)(Math.random()*8+8);//密码长度大于等于8小于16

while(true){//因为随机存在产生全为数字或字母的密码,所以需要判断循环直至符合

for(i=0;i

{

intt=(int)(Math.random()*3);//随机大小写字母以及数字

if(t==0){

up=(char)(Math.random()*26+'A');

password+=up;

}

elseif(t==1){

low=(char)(Math.random()*26+'a');

password+=low;

}

else{

number=(int)(Math.random()*10);

password+=number;

}

}

if(password_test(password))break;

}

}

voidsetSex(){

if((int)(Math.random()*2)==1)

sex+="男";

else

sex+="女";

}

voidsetDate()throwsParseException{

Stringstr=idNum.substring(6,14);

SimpleDateFormatf=newSimpleDateFormat("yyyyMMdd");

birt

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1