实验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);
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