如执行读/写操作引起阻塞。
3.死亡状态,不能再调用start()方法。 4.新建和死亡状态。
5.两种方法:用Thread类或其子类。 6.使用 setPrority(int grade)方法。
7.Java使我们可以创建多个线程,在处理多线程问题时,我们必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一个线程需要修改这个变量。我们应对这样的问题作出处理,否则可能发生混乱。
8.当一个线程使用的同步方法中用到某个变量,而此变量又需要其它线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。使用wait方法可以中断方法的执行,使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。其它线程如果在使用这个同步方法时不需要等待,那么它使用完这个同步方法的同时,应当用notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。 9.不合理。 10.“吵醒”休眠的线程。一个占有CPU资源的线程可以让休眠的线程调用interrupt 方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。 二、选择题
1.A。2.A。3.B。 三、阅读程序
1.属于上机调试题目,解答略。 2.属于上机调试题目,解答略。 3.属于上机调试题目,解答略。 4.属于上机调试题目,解答略。 5.属于上机调试题目,解答略。 6.属于上机调试题目,解答略 7.【代码】:BA。
8.属于上机调试题目,解答略 四、编写程序
1. public class E {
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); } } }
2. 参照本章例子6 3.参照本章例子9
习题十三(第13章)
一、问答题
1.一个URL对象通常包含最基本的三部分信息:协议、地址、资源。 2.URL对象调用InputStream openStream() 方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入到客户端。 3.客户端的套接字和服务器端的套接字通过输入、输出流互相连接后进行通信。 4.使用方法accept(),accept()会返回一个和客户端Socket对象相连接的Socket对象。accept方法会堵塞线程的继续执行,直到接收到客户的呼叫。。 5.域名/IP。 四、编程题 1. (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(\收到的结果:\ box.add(showResult);
connection.addActionListener(this); send.addActionListener(this); thread=new Thread(this); add(box);
setBounds(10,30,300,400); setVisible(true); validate();
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e) { System.exit(0); } }); }
相关推荐: