读书人

线程操作有关问题

发布时间: 2012-02-09 18:22:27 作者: rapoo

线程操作问题
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.io.*;
public class chatServer {

/**
* @param args
*/
private ServerSocket ss=null;
private Socket s=null;
private boolean Started=true;
private List <Clint> Clints=new ArrayList <Clint> ();
public static void main(String[] args) {
new chatServer();
}

public chatServer()
{
boolean Started=true;
try {
ss=new ServerSocket(6666);

while(Started)
{
s=ss.accept();
Clint c=new Clint(s);
Clints.add(c);
Thread t=new Thread(c);
t.start();
}
//用线程实现以上方法
System.out.println( "我跳出来了 ");

} catch (IOException e) {
e.printStackTrace();
}
}
class Clint implements Runnable{
Socket s;
DataInputStream dis;
DataOutputStream dos;
public void run() {

}
public Clint(Socket s)
{
this.s=s;

try {
dis=new DataInputStream(s.getInputStream());
String str=dis.readUTF();
if(str.equals( "bye "))
{
System.out.println( "和服务器断开连接 ");
Started=false;
dis.close();
s.close();
}
else
{
System.out.println(str);
}
System.out.println(Started);
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(String str)
{
try {
dos.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}

}
}

用一个客户端给服务端发信息,然后服务端打印。当客户端输入bye是是服务端停止,以上是服务端的代码,我再内部类中操作外部类的一个变量,为什么再内部类中可以看到值已经变了,开始外部类的循环还在继续,也就是我输入数据后服务器还会打印

下面是客户端的代码

import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.border.Border;

import sun.awt.WindowClosingListener;
public class chatClint extends Frame {

/**
* @param args
*/
private Socket s=null;
private TextArea ta=null;
private TextField tf=null;

public static void main(String[] args) {

new chatClint();
}
public chatClint()
{
this.setLocation(100,100);
this.setSize(400,300);
this.setVisible(true);
ta=new TextArea();
tf=new TextField();
tf.addActionListener(new Post());
add(ta,BorderLayout.NORTH);
add(tf,BorderLayout.SOUTH);
pack();
setVisible(true);


this.addWindowListener(new WindowAdapter()
{

@Override
public void windowClosing(WindowEvent e) {
System.exit(1);
}

});
}
class Post implements ActionListener
{

public void actionPerformed(ActionEvent e) {


String str=tf.getText();
ta.setText(str);
//设置输出流
try {
s=new Socket( "192.168.1.104 ",6666);
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
dos.writeUTF(str);
dos.flush();
dos.close();
s.close();
} catch (IOException e1) {
System.out.println( "和服务器连接已经断开 ");
}
tf.setText( " ");

}

}

}


[解决办法]
你的构造方法中定义了一个局部变量Started,你将它注释掉就可以了。
public chatServer()
{
boolean Started=true;//将这一行注释掉,就可以了!!!!!
try {
ss=new ServerSocket(6666);

while(Started)
{
s=ss.accept();
Clint c=new Clint(s);
Clints.add(c);
Thread t=new Thread(c);
t.start();
}
//用线程实现以上方法
System.out.println( "我跳出来了 ");

} catch (IOException e) {
e.printStackTrace();
}
}
[解决办法]
汗,你定义了一个全局变量又定义了一个局部变量,started

冲突了,内部类里面可以修改的是全局变量,你的那个函数内部是要使用自己的局部变量的。

所以全局变量被修改started=false,但是函数体内的局部变量没有被修改,started=true.

把局部变量去掉应该就可以了

读书人网 >J2SE开发

热点推荐