实验10 多线程的实验.docx
- 文档编号:26394552
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:18
- 大小:104.92KB
实验10 多线程的实验.docx
《实验10 多线程的实验.docx》由会员分享,可在线阅读,更多相关《实验10 多线程的实验.docx(18页珍藏版)》请在冰豆网上搜索。
实验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);
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);
Iterator
while(it.hasNext()){
TextAreaE.setText(TextAreaE.getText()+a.Take(it.next())+"\n");
}
}
}
classAccountList{
privateArrayList
AccountList(){
AL=newArrayList
}
publicvoidadd(Accounta){
AL.add(a);
}
publicArrayList
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验10 多线程的实验 实验 10 多线程