我想在多线程的类中定义一个LinkedList,然后把每一个链接都创建一个线程,把Socket收到的信息全部存进LinkedList,然后定义一个函数,取出数据,但是实际在运行中无法获取LinkedList中的数据
代码如下:import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.LinkedList;public class Connect extends Thread{
private Socket socket;
private static LinkedList DataList = new LinkedList();
private static Object lockObject = new Object();
public Connect(){
this.socket = null;
}
public Connect(Socket socket){
this.socket = socket;
}
public void run(){
byte[] buffer = new byte[4096];
System.out.println("客户端:"+socket.getInetAddress().toString());
try {
InputStream is = socket.getInputStream();
is.read(buffer);
synchronized(lockObject){
String Data = new String(buffer);
DataList.add(Data);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String GetMessage(){
synchronized(lockObject){
if (DataList.size() > 0)
{
//System.out.println(DataList.size());
String Buf = (String) DataList.getFirst();
DataList.removeFirst();
return Buf;
}
else
return "";
}
}
}
代码如下:import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.LinkedList;public class Connect extends Thread{
private Socket socket;
private static LinkedList DataList = new LinkedList();
private static Object lockObject = new Object();
public Connect(){
this.socket = null;
}
public Connect(Socket socket){
this.socket = socket;
}
public void run(){
byte[] buffer = new byte[4096];
System.out.println("客户端:"+socket.getInetAddress().toString());
try {
InputStream is = socket.getInputStream();
is.read(buffer);
synchronized(lockObject){
String Data = new String(buffer);
DataList.add(Data);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String GetMessage(){
synchronized(lockObject){
if (DataList.size() > 0)
{
//System.out.println(DataList.size());
String Buf = (String) DataList.getFirst();
DataList.removeFirst();
return Buf;
}
else
return "";
}
}
}
可以看出DataList是在添加节点,但是在mian()方法中新创建一个多线程类,但是不执行他,直接调用GetMessage()得到的DataList是一个空的
代码如下
Connect control = new Connect();
while(true){
if (control.GetMessage().length() >0)
System.out.println(control.GetMessage());
}