写一下写程序的时候遇到的各种问题
1.为什么要实现Runnable接口?
首先实现Runnable类可以把这个类定义成一个线程类,虽然通过继承Thread类的方式也可以完成多线程的建立。但是这种方式有一个弊端,如果一个类已经有了自己的父类就不能继承Thread类因为java单继承的局限性。可是该类中还有部分代码需要被多个线程同时执行。这时就应该对该类进行额外的功能扩展,java就提供了一个接口Runnable。这个接口中定义了run方法其实run方法的定义就是为了存储多线程要运行的代码。所以,通常创建线程通常实现Runnable接口。其实是将不同类中需要被多线程执行的代码进行抽取。将多线程要运行的代码的位置单独定义到接口中。为其他类进行功能扩展提供了前提。所以Thread类在描述线程时,内部定义的run方法,也来自于Runnable接口。继承Thread是可以对它类中方法,进行子类的复写。但是如果不需要这样的复写动作的话,只为定义线程代码存放位置,实现Runnable接口更方便一些。所以Runnable接口将线程要执行的任务封装成了对象。
还有就是run()方法在每个线程执行的时候都会首先执行。
public class TcpIp1 implements Runnable{
DatagramSocket socker = null;
BufferedReader reader = null;
private String toIp;
private int toPort;
private int fromPort;
public TcpIp4(String toIp, int toPort, int fromPort) {
this.toIp = toIp;
this.toPort = toPort;
this.fromPort = fromPort;
try {
socker = new DatagramSocket(fromPort);
//读取控制台数据
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
String data = null;
try {
data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIp, this.toPort));
socker.send(packet);
if (data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socker.close();
}
}
public class TcpIp2 implements Runnable {
DatagramSocket socket = null;
private int port;
private String msgFrom;
public jieshou1(int port, String msgFrom) {
this.port = port;
this.msgFrom = msgFrom;
try {
socket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
socket.receive(packet);
byte[] datas = packet.getData();
String receiveData = new String(datas, 0, datas.length);
System.out.println(msgFrom + ":" + receiveData);
if (receiveData.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
socket.close();
}
}
public static void main(String[] args) {
new Thread(new TcpIp1("localhost",9999,7777)).start();
new Thread(new TcpIp2(8888,"qinjiang")).start();
}
public static void main(String[] args) {
new Thread(new TcpIp1("localhost",8888,5555)).start();
new Thread(new TcpIp2(9999,"xuesheng")).start();
}