我写了两个类...想通过java的垃圾收集来关掉我在运行的thread...
但调用function2()进行关闭时...会出现java.net.SocketException: socket closed
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
at java.net.DatagramSocket.receive(DatagramSocket.java:712)
at serverRun.Server.recPacket(Server.java:33)
at serverRun.Server.run(Server.java:22)class A{
private B b;
function1(){
b = new B();
b.start();
}
function2(){
b.threadStop()
}
}class B extends Thread{
private boolean threadStop = false;
int port;
DatagramSocket socket;
public void run(){
try{
while(threadStop == false){
//udp 接收信息
}catch(...){
....
}
}public void threadStop(){
this.threadStop = true;
this.port = 0;
try{
//socket.disconnect(); 如果用disconnect 就会倒致程序死掉..
socket.close();
}catch(Exception ex){
}finally{
this.socket = null;
}
}
}
但调用function2()进行关闭时...会出现java.net.SocketException: socket closed
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
at java.net.DatagramSocket.receive(DatagramSocket.java:712)
at serverRun.Server.recPacket(Server.java:33)
at serverRun.Server.run(Server.java:22)class A{
private B b;
function1(){
b = new B();
b.start();
}
function2(){
b.threadStop()
}
}class B extends Thread{
private boolean threadStop = false;
int port;
DatagramSocket socket;
public void run(){
try{
while(threadStop == false){
//udp 接收信息
}catch(...){
....
}
}public void threadStop(){
this.threadStop = true;
this.port = 0;
try{
//socket.disconnect(); 如果用disconnect 就会倒致程序死掉..
socket.close();
}catch(Exception ex){
}finally{
this.socket = null;
}
}
}
如下:
class B extends Thread{
private boolean threadStop = false;
int port;
DatagramSocket socket;
public void run(){
try{
while(ture){
if (!threadStop) {
//udp 接收信息
} else {
socket.close();
break;
}
}catch(...){
....
}
}public void threadStop(){
this.threadStop = true;
}
import java.net.DatagramSocket;import org.eclipse.swt.widgets.Text;import serverGUI.ServerWindow;public class Server extends Thread { private boolean threadStop = false; int port; DatagramSocket socket; public Server() {
this.threadStop = false;
this.socket = null;
} public void run() {
System.out.println("thread runs");
this.recPacket();
} private void recPacket() {
try {
byte[] buffer = new byte[debug.Constants.packageLen];
port = debug.Constants.port;
socket = new DatagramSocket(port);
DatagramPacket packet;
while (threadStop == false) {
if (this.threadStop == false) {
packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
if (debug.Constants.isDebug) {
String ss = new String(packet.getData());
System.out.println("ss");
}
//new DealingWithPacket(packet).start();
}else{
packet = null;
socket.close();
socket = null;
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
} public void threadStop() {
this.threadStop = true;
}
}错误
java.net.BindException: Address already in use: Cannot bind
at java.net.PlainDatagramSocketImpl.bind0(Native Method)
at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:82)
at java.net.DatagramSocket.bind(DatagramSocket.java:368)
at java.net.DatagramSocket.<init>(DatagramSocket.java:210)
at java.net.DatagramSocket.<init>(DatagramSocket.java:261)
at java.net.DatagramSocket.<init>(DatagramSocket.java:234)
at serverRun.Server.recPacket(Server.java:32)
at serverRun.Server.run(Server.java:25)
然后再new一个线程时就有问题了...问题就是上面的问题