Java程序设计(实验7)实验日志指导老师:张林实验地点:S311室D机段实验时间:2014年5月27日第14周星期二第5、6节学院计算机学院专业计算机应用班级5311204学号2012216832姓名唐知庚实验名称:多线程和数据库编程实验环境:PC机(CPUInterPentium42.4GHz内存256M40G),windows2000实验目的:1.掌握线程的基本概念。2.掌握线程的创建、启动、结束的方法。3.理解线程的同步和死锁。4.掌握数据库的基本操作。5.掌握简单的SQL。6.掌握JDBC编程技术。实验内容及结果:3.1多线程多线程允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。Java提供了类java.lang.Thread来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程。有两种方法创建线程:1.继承Thread类,覆盖方法run();2.实现Runnable接口。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。这套机制就是synchronized关键字,它包括两种用法:synchronized方法和synchronized块。1.编写一个有两个线程的程序,一个线程对数据执行加法操作,另外一个执行减法操作。能控制线程的起停。2.在记事本编辑如下源程序:importjava.awt.*;importjava.util.*;importjava.awt.event.ActionListener;importjava.awt.event.ActionEvent;classData{privateintdata=100;publicintgetData(){returndata;}publicvoidsetData(intd){data=d;}}classAThreadextendsThread{Labeldis;Datadata;AThread(Labelds,Datadt){dis=ds;data=dt;}publicvoidrun(){Randomran=newRandom();while(true){synchronized(data){Strings=线程A处理:+data.getData()++1=;data.setData(data.getData()+1);dis.setText(s+data.getData());System.out.println(s+data.getData());}try{sleep(ran.nextInt(3)*1000);}catch(InterruptedExceptione){}}}}classBThreadextendsThread{Labeldis;Datadata;BThread(Labelds,Datadt){dis=ds;data=dt;}publicvoidrun(){Randomran=newRandom();while(true){synchronized(data){Strings=线程B处理:+data.getData()+-1=;try{sleep(2000);}catch(InterruptedExceptione){}data.setData(data.getData()-1);dis.setText(s+data.getData());System.out.println(s+data.getData());}try{sleep(ran.nextInt(6)*1000);}catch(InterruptedExceptione){}}}}classEx13extendsFrameimplementsActionListener{Labeldis;Datadata;AThreadat;BThreadbt;Buttonb;Ex13(){dis=newLabel();data=newData();b=newButton(暂停);b.addActionListener(this);add(dis,Center);add(b,South);}publicvoidgo(){at=newAThread(dis,data);bt=newBThread(dis,data);at.start();bt.start();b.setLabel(暂停);}publicstaticvoidmain(Stringargs[]){Ex13mainFrame=newEx13();mainFrame.setSize(300,200);mainFrame.setTitle(Ex13);mainFrame.setVisible(true);mainFrame.go();}publicvoidactionPerformed(ActionEventparm1){if(parm1.getActionCommand()==暂停){at.suspend();bt.suspend();b.setLabel(开始);}else{at.resume();bt.resume();b.setLabel(暂停);}}}3.保存程序Ex13.java,编译运行程序,观察执行结果,理解程序中的同步机制。结果如下图所示:4.去掉程序中的synchronized(data),(共有两处),重新编译运行程序,对比结果有什么不同。运行结果为:结果的不同:运行时语法错误,只有线程A运行。5.试用创建线程的方法2,即实现Runnable接口,改写该程序。改写后的程序源代码为:importjava.awt.*;importjava.util.*;importjava.awt.event.ActionListener;importjava.awt.event.ActionEvent;classData{privateintdata=100;publicintgetData(){returndata;}publicvoidsetData(intd){data=d;}}classAThreadextendsThread{Labeldis;Datadata;AThread(Labelds,Datadt){dis=ds;data=dt;}publicvoidrun(){Randomran=newRandom();while(true){/*synchronized(data)*/{Strings=线程A处理:+data.getData()++1=;data.setData(data.getData()+1);dis.setText(s+data.getData());System.out.println(s+data.getData());}try{Thread.sleep(ran.nextInt(3)*1000);}catch(InterruptedExceptione){}}}}classBThreadextendsThread{Labeldis;Datadata;BThread(Labelds,Datadt){dis=ds;data=dt;}publicvoidrun(){Randomran=newRandom();while(true){/*synchronized(data)*/{Strings=线程B处理:+data.getData()+-1=;try{Thread.sleep(2000);}catch(InterruptedExceptione){}data.setData(data.getData()-1);dis.setText(s+data.getData());System.out.println(s+data.getData());}try{Thread.sleep(ran.nextInt(6)*1000);}catch(InterruptedExceptione){}}}}classEx13extendsFrameimplementsActionListener{Labeldis;Datadata;//AThreadat;//BThreadbt;AThreadat;//=newAThread(dis,data);BThreadbt;//=newBThread(dis,data);Threadaat;//=newThread(at);Threadbbt;//=newThread(bt);Buttonb;Ex13(){dis=newLabel();data=newData();at=newAThread(dis,data);bt=newBThread(dis,data);aat=newThread(at);bbt=newThread(bt);b=newButton(暂停);b.addActionListener(this);add(dis,Center);add(b,South);}publicvoidgo(){at=newAThread(dis,data);bt=newBThread(dis,data);at.start();bt.start();b.setLabel(暂停);}publicstaticvoidmain(Stringargs[]){Ex13mainFrame=newEx13();mainFrame.setSize(300,200);mainFrame.setTitle(Ex13);mainFrame.setVisible(true);mainFrame.go();}publicvoidactionPerformed(ActionEventparm1){if(parm1.getActionCommand()==暂停){at.suspend();bt.suspend();b.setLabel(开始);}else{at.resume();bt.resume();b.setLabel(暂停);}}}运行结果为:实验体会(简述实验中所遇到的问题及解决方法):通过本次实验的学习,我基本掌握了线程的创建、启动、结束的方法以及线程的同步和死锁,自行编写了一个含有多个线程的程序并能成功运行它,我们应该多多体会各项代码的意义,逐渐掌握把代码写得更简短,功能更完善。