习题14 1.
(1)创建数据源
选择“控制面板”→“管理工具”→“ODBC数据源”(某些window/xp系统,需选择“控制面板”→“性能和维护”→“管理工具”→“ODBC数据源”)。双击ODBC数据源图标,选择“系统DSN”或“用户DSN”,单击“添加”按钮,可以创建新的数据源。 (2) 数据源选择驱动程序
选择单击“添加”按钮,出现为新增的数据源选择驱动程序界面,如果要访问Access数据库,选择Microsoft Acess Driver(*.mdb)。单击完成按钮。 (3) 数据源名称及对应数据库的所在位置
在设置数据源具体项目的对话框,在名称栏里为数据源起一个自己喜欢的名字。这个数据源就是指某个数据库。在“数据库选择”栏中选择一个已经准备好的数据库。 2.参照本章例子14.2。 3.参照本章例子14.3。 4.参照本章例子14.4。
5.使用预处理语句不仅减轻了数据库的负担,而且也提高了访问数据库
的速度。
6.事务由一组SQL语句组成,所谓事务处理是指:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。步骤:
(1)使用setAutoCommit(boolean autoCommit)方法
con对象首先调用setAutoCommit(boolean autoCommit)方法,将参数autoCommit取值false来关闭默认设置:
con.setAutoCommit(false);
(2) 使用commit()方法。con调用commit()方法就是让事务中的SQL语句全部生效。
(3) 使用rollback()方法。con调用rollback()方法撤消事务中成功执行过的SQL语句对数据库数据所做的更新、插入或删除操作,即撤消引起数据发生变化的SQL语句操作,将数据库中的数据恢复到commi()方法执行之前的状态。 7.参照本章例子14.2。
习题15
1.4种状态:新建、运行、中断和死亡。 2.有4种原因的中断:
JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。 线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状态。经过参数millsecond指定的豪秒数之后,该线程就重新进到线程队列中排队等待CPU资源,以便从中断处继续运行。
线程使用CPU资源期间,执行了wait()方法,使得当前线程进入等待状态。等待状态的线程不会主动进到线程队列中排队等待CPU资源,必须由其他线程调用notify()方法通知它,使得它重新进到线程队列中排队等待CPU资源,以便从中断处继续运行。
线程使用CPU资源期间,执行某个操作进入阻塞状态,比如执行读/写操作引起阻塞。进入阻塞状态时线程不能进入排队队列,只有当引起阻塞的原因消除时,线程才重新进到线程队列中排队等待CPU资源,以便从原来中断处开始继续运行。 3.死亡状态,不能再调用start()方法。 4.新建和死亡状态。
5.两种方法:用Thread类或其子类。 6.使用 setPrority(int grade)方法。
7.Java使我们可以创建多个线程,在处理多线程问题时,我们必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一个线程需要修改这个变量。我们应对这样的问题作出处理,否则可能发生混乱。
8.当一个线程使用的同步方法中用到某个变量,而此变量又需要其它线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。使用wait方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。其它线程如果在使用这个同步方法时不需要等待,那么它使用完这个同步方法的同时,应当用notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待 9.不合理。
10.“吵醒”休眠的线程。一个占有CPU资源的线程可以让休眠的线程调用i
nterrupt 方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。 11.
public class Xiti11
{ public static void main(String args[]) { Cinema a=new Cinema(); a.zhang.start(); a.sun.start(); a.zhao.start(); } }
class TicketSeller //负责卖票的类。
{ int fiveNumber=3,tenNumber=0,twentyNumber=0; public synchronized void sellTicket(int receiveMoney)
{ if(receiveMoney==5) { fiveNumber=fiveNumber+1;
System.out.println(Thread.currentThread().getName()+ "给我5元钱,这是您的1张入场卷"); }
else if(receiveMoney==10) { while(fiveNumber<1)
{ try { System.out.println(Thread.currentThread().getName()+"靠边等"); wait();
System.out.println(Thread.currentThread().getName()+"结束等待"); }
catch(InterruptedException e) {} }
fiveNumber=fiveNumber-1; tenNumber=tenNumber+1;
System.out.println(Thread.currentThread().getName()+ "给我10元钱,找您5元,这是您的1张入场卷"); }
else if(receiveMoney==20) { while(fiveNumber<1||tenNumber<1)
{ try { System.out.println(Thread.currentThread().getName()+"靠边等"); wait();
System.out.println(Thread.currentThread().getName()+"结束等待"); }
catch(InterruptedException e) {} }
fiveNumber=fiveNumber-1; tenNumber=tenNumber-1;
twentyNumber=twentyNumber+1;
System.out.println(Thread.currentThread().getName()+
"给20元钱,找您一张5元和一张10元,这是您的1张入场卷"); } notifyAll(); } }
class Cinema implements Runnable { Thread zhang,sun,zhao; TicketSeller seller; Cinema()
{ zhang=new Thread(this); sun=new Thread(this); zhao=new Thread(this);
zhang.setName("张小有");
sun.setName("孙大名"); zhao.setName("赵中堂"); seller=new TicketSeller(); }
public void run()
{ if(Thread.currentThread()==zhang) { seller.sellTicket(20); }
else if(Thread.currentThread()==sun) { seller.sellTicket(10); }
else if(Thread.currentThread()==zhao) { seller.sellTicket(5); } } }
12.参照本章例子9。 13.参照本章例子19。 14.BA
习题16
1.URL对象调用InputStream openStream() 方法可以返回一个输入流。
2.客户端的程序使用Socket类建立负责连接到服务器的套接字对象称为socket对象。 使用Socket的构造方法Socket(String host,int port),建立连接到服务器的套接字对象。
参考16.3.2 3.JEditorPane
4.会返回一个和客户端Socket对象相连接的Socket对象。 5. 域名/IP 地址 例如,www.sina.com.cn/202.108.35.210 6. (1) 客户端 import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Client
{ public static void main(String args[]) { new ComputerClient(); } }
class ComputerClient extends Frame implements Runnable,ActionListener { Button connection,send; TextField inputText,showResult; Socket socket=null; DataInputStream in=null; DataOutputStream out=null; Thread thread; ComputerClient() { socket=new Socket(); setLayout(new FlowLayout()); Box box=Box.createVerticalBox();
connection=new Button("连接服务器"); send=new Button("发送"); send.setEnabled(false); inputText=new TextField(12); showResult=new TextField(12); box.add(connection);
box.add(new Label("输入三角形三边的长度,用逗号或空格分隔:")); box.add(inputText); box.add(send);
box.add(new Label("收到的结果:"));