100分求救:关于wait()和notify()的问题,各位大哥请进!

gull 2002-06-03 10:09:31
我的问题是我想提供一个功能,把ServerThread暂停,我想到了用wait(),可是我用了以后,连主界面都没反映了,大家帮我看看吧!我头发都快急白乐!谢谢!!!!!!!
下面是源程序,是可以直接运行的,大家Copy,paste,运行一下,帮帮忙吧!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import javax.swing.border.*;

class ClientThread extends Thread{
Socket ClientSocket;
public ClientThread(Socket socket){
ClientSocket=socket;
}
public void run(){
//operations
}
}

class messager{
static void printmsg(String msg){

JOptionPane.showMessageDialog(null,msg,"Message",JOptionPane.INFORMATION_MESSAGE);
}
static void printerr(String msg){
JOptionPane.showMessageDialog(null,msg,"ERROR",JOptionPane.ERROR_MESSAGE);
}
}

class JStatusBar extends JLabel{

private JLabel text=new JLabel();

public final float LEFT=super.LEFT_ALIGNMENT;
public final float RIGHT=super.RIGHT_ALIGNMENT;
public final float CENTER=super.CENTER_ALIGNMENT;

JStatusBar(){
super();
setAlignmentX(LEFT_ALIGNMENT);
setAlignmentY(TOP_ALIGNMENT);
setBorder(new BevelBorder(BevelBorder.LOWERED));
}

public void show(String msg){
setText(msg);
}
public void setAlignment(float pos){
setAlignmentX(pos);
}
}

class Tcpserver{

private static ServerThread server;
//main Frame components
private static JFrame mainFrame=new JFrame();
private static JTextArea textarea=new JTextArea();
private static JScrollPane jsp=new JScrollPane(textarea);
private static JMenuBar menubar=new JMenuBar();
private static JMenu mnuOperations=new JMenu("Operations");
private static JStatusBar statusbar=new JStatusBar();

//Menus
private static JMenuItem mnuStart=new JMenuItem("Start Server");
private static JMenuItem mnuStop=new JMenuItem("Stop Server");
private static JMenuItem mnuSettings=new JMenuItem("Settings");
private static JMenuItem mnuBroadcast=new JMenuItem("Broadcast...");
private static JMenuItem mnuExit=new JMenuItem("Exit");

//Actions for the menu
private static Action actStart=
new AbstractAction("Start Server"){
public void actionPerformed(ActionEvent e){
//operations to start
}
};
private static Action actStop=
new AbstractAction("Stop Server"){
public void actionPerformed(ActionEvent e){
//operations to stop
server.Stop();
}
};

private static Action actSettings=
new AbstractAction("Settings"){
public void actionPerformed(ActionEvent e){
//operations to lauch the settings dialog

}
};

private static Action actExit=
new AbstractAction("Exit"){
public void actionPerformed(ActionEvent e){
//operations to close
mainFrame.dispose();
System.exit(0);
}
};

private static Action actBroadcast=
new AbstractAction("Broadcast..."){
public void actionPerformed(ActionEvent e){
//operations to broadcast msg

}
};

//methods
public static void showMessage(String msg){
textarea.append(msg+"\n");
}
public static void showStatus(String msg){
statusbar.show(msg);
}
public static void clear(){
textarea.setText("");
}
public static void main(String args[]) throws Exception{

//initilize the main frame
mainFrame.setSize(300, 400);
mainFrame.setTitle("Tcpserver");
mainFrame.getContentPane().add(jsp);
mainFrame.getContentPane().add(statusbar,BorderLayout.SOUTH);
menubar.add(mnuOperations);
mainFrame.setJMenuBar(menubar);
mainFrame.setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);

//setup menu actions
mnuStart.setAction(actStart);
mnuStop.setAction(actStop);
mnuSettings.setAction(actSettings);
mnuBroadcast.setAction(actBroadcast);
mnuExit.setAction(actExit);

//add menu items to menu
mnuOperations.add(mnuStart);
mnuOperations.add(mnuStop);
mnuOperations.addSeparator();
mnuOperations.add(mnuSettings);
mnuOperations.add(mnuBroadcast);
mnuOperations.addSeparator();
mnuOperations.add(mnuExit);

//create a server thread and start to listen
server=new ServerThread();
server.start();
}
}

class ServerThread extends Thread{

private final int PORT=1020;
private ServerSocket LocalServerSocket;

public synchronized void Stop(){
try{
wait();
}
catch(Exception e){
messager.printerr(e.getMessage());
}
}

public void run(){

//setup the server socket and
//waiting for client connections
try{
LocalServerSocket=new ServerSocket(PORT);
Tcpserver.clear();
Tcpserver.showMessage("Server Started.");
Tcpserver.showStatus("Server Started.");
Tcpserver.showMessage("Listening to port:1020...");

//listening to the port
//block if no connection requested

while(true){
//spawn a child thread
new ClientThread(LocalServerSocket.accept());
}
}
catch(IOException ioe){
messager.printerr("IO Exception Detected:"+ioe.getMessage());
messager.printerr("The Application is now terminated.");
System.exit(1);
}
}
}
...全文
49 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gull 2002-06-04
  • 打赏
  • 举报
回复
finally,I solve it!using close and catch the SocketException.
very happy now. thanks~~~!
gull 2002-06-04
  • 打赏
  • 举报
回复
sorry, I am in school now and here got no IME,so I have to use english.

suppose the program run up to the line:
new ClientThread(LocalServerSocket.accept());
and the thread has been blocked due to the call to accept();
so the program is just stop there and never check the flag, and the flag got no use.
so any other ideas? thanks anyway.
heifei 2002-06-04
  • 打赏
  • 举报
回复
还是用设置标志位关闭吧:
设置class ServerThread extends Thread{
private boolean stoped=false;
.......
public void stop(){stoped=true};//添加方法
public void run(){
try{
LocalServerSocket=new ServerSocket(PORT);
Tcpserver.clear();
......

while(!stoped){//监测标志位
//spawn a child thread
new ClientThread(LocalServerSocket.accept());
}
}
catch(IOException ioe){
messager.printerr("IO Exception Detected:"+ioe.getMessage());
messager.printerr("The Application is now terminated.");
System.exit(1);
}finally{
LocalServerSocket.close();//加入
}
}
这样你就可以在main()里调用ServerSocket.stop()来终止了
gull 2002-06-04
  • 打赏
  • 举报
回复
我说的是LocalServerSocket,我要关闭的是主线程里的ServerSocket.可是我每次调用LocalServerSocket.close(),就会抛出IO异常。

另外我试了一下sleep(),可是这下连我的主线程也没反映了。大家再帮帮忙吧!
killjoy 2002-06-04
  • 打赏
  • 举报
回复
这个应该很好办吧!你的LocalServerSocket是在主线程吧?
while(true) {
Socket s=LocalServerSocket.accept();
}
你说的你的线程被block后,你不想要这个Server了?你说的是s还是LocalServerSocket?如果是s呀,我就建议你为打开的服务建立一个线程,把这个线程关闭就可以了.
buick555 2002-06-03
  • 打赏
  • 举报
回复
你可以试一试sleep()
gull 2002-06-03
  • 打赏
  • 举报
回复
我现在已经明白我的问题在哪里了!谢谢各位的参与。可是虽然知道了问题在哪里,我还是找不到解决的方法。现在我的问题是,怎样做才能停止一个已经开始accept()的ServerSocket.
比如说
LocalServerSocket.accept();之后当前的线程就被block了,在这个时候,如果我不想再继续
开这个server,我该怎样关闭呢?我曾经试过LocalServerSocket.close(),但是这样会抛出IOException.各位大大,有什么办法吗?谢谢!!!

popco2 2002-06-03
  • 打赏
  • 举报
回复
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupup upupupupupupup upupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupupupupupup upupup
upupup upupupupupupup upupupupupup upupupupupupupupupupupupupupup
upupup upupupupupup upupupupupupupupupupup upupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
popco2 2002-06-03
  • 打赏
  • 举报
回复
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
upupup upupupupupupup upupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupup upupup
upupup upupupupupupup upupupupupup upupupupupupupupupupup upupup
upupup upupupupupupup upupupupupup upupupupupupupupupupupupupupup
upupup upupupupupup upupupupupupupupupupup upupup
upupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupupup
gull 2002-06-03
  • 打赏
  • 举报
回复
copy 到编译器里面运行一下就好了。帮帮忙吧!谢谢!
Jawan_lee 2002-06-03
  • 打赏
  • 举报
回复
太长了,难得看啊

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧