62,614
社区成员
发帖
与我相关
我的任务
分享
//处理接受数据的线程
public class recieveThread extends Thread{
byte[] recvBuf = new byte[100];// 创建字节数组
private DatagramPacket dp;
private DatagramSocket ds;
int[] num = new int[100];
byte[] buf = new byte[100];
recieveThread(DatagramPacket dp,DatagramSocket ds) {
this.dp = dp;
this.ds = ds;
}
public void run() {
try {
ds.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
String string = new String (dp.getData(),0,dp.getLength());//字符串接收数据
System.out.println(string);
}
}
//UDP服务端
public class Userver {
public static void main(String[] args) {
DatagramSocket ds = null;
DatagramPacket dp = null;
String str = null;
byte[] recvBuf = new byte[100];
boolean isrun = true;
try {
ds = new DatagramSocket(8887);//创建socket
dp = new DatagramPacket(recvBuf, recvBuf.length);//创建接受数据包
} catch (SocketException e) {
e.printStackTrace();
}
while (isrun) {
recieveThread rt = new recieveThread(dp, ds);//传递参数
rt.start();
//线程启动
}
}
}
class Test implements Runnable{
public void run(){
for(int i=0; i<100000; i++){}
}
}
class Main{
public static void main(String[] args){
final Executor exec = Executors.newFixedThreadPool(100);
while(true){
Test t = new Test();
exec.execute(t);
}//while
}
}
这个改动很简单,就是将创建的新线程的交给了线程池去管。
希望对你有帮助。
//处理接受数据的线程
public class recieveThread extends Thread{
byte[] recvBuf = new byte[100];// 创建字节数组
private DatagramPacket dp;
private DatagramSocket ds;
int[] num = new int[100];
byte[] buf = new byte[100];
recieveThread(DatagramPacket dp,DatagramSocket ds) {
this.dp = dp;
this.ds = ds;
}
public void run() {
try {
while (true) {
ds.receive(dp);
String string = new String (dp.getData(),0,dp.getLength());//字符串接收数据
System.out.println(string);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//UDP服务端
public class Userver {
public static void main(String[] args) {
DatagramSocket ds = null;
DatagramPacket dp = null;
String str = null;
byte[] recvBuf = new byte[100];
try {
ds = new DatagramSocket(8887);//创建socket
dp = new DatagramPacket(recvBuf, recvBuf.length);//创建接受数据包
} catch (SocketException e) {
e.printStackTrace();
}
for (int i = 0; i< 10; i++) {
recieveThread rt = new recieveThread(dp, ds);//传递参数
rt.start();
//线程启动
}
}
}
打印了乱码是因为你发送端和接收端encoding不一样,看看new String的几个构造函数,以及Charset的使用方法吧 while (isrun) {
recieveThread rt = new recieveThread(dp, ds);//传递参数
rt.start();
}
这段代码有问题,在不断的创建新的线程对象。
试试这样改
第一步:RecieveThread 类改为实现 Runnable 接口;
第二步:main方法中加入Executor;
修改代码如下:
public static void main(String[] args) {
DatagramSocket ds = null;
DatagramPacket dp = null;
String str = null;
byte[] recvBuf = new byte[100];
boolean isrun = true;
try {
ds = new DatagramSocket(8887);//创建socket
dp = new DatagramPacket(recvBuf, recvBuf.length);//创建接受数据包
} catch (SocketException e) {
e.printStackTrace();
}
final Executor exec = Executors.newFixedThreadPool(100);//创建固定线程池
while (isrun) {
recieveThread rt = new recieveThread(dp, ds);
exec.execute(rt);
}//while
}
}