多线程
Java中多线程的实现有两种方式,一种是继承extends Thread类,另一种是实现Runnable接口
而Thread类实现了Runnable接口,他们之间存在多态性,在Java中只有单继承,而允许实现多个接口。所以常用作的创建线程的方法是实现Runnable接口。
下面是两种方法的实现举例:
继承Thread类创建线程
public class ThreadTest {
public static void main(String[] args) {
MyThread thread = new MyThread() ;
thread.start() ;
int count = 5 ;
while(count != 0) {
count -- ;
System.out.println("主线程在跑");
}
}
//继承thread类实现多线程方法
class MyThread extends Thread {
public void run() {
int count = 10 ;
while(count != 0) {
count-- ;
System.out.println("线程正在执行");
}
}
}
实现Runnable接口创建线程
public class ThreadTest {
public static void main(String[] args) {
MyThread thread = new MyThread() ;
Thread t = new Thread(thread) ;
t.start() ;
int count = 5 ;
while(count != 0) {
count -- ;
System.out.println("主线程在跑");
}
}
//实现runnable接口
class MyThread implements Runnable {
@Override
public void run() {
int count = 10 ;
while(count != 0) {
count -- ;
System.out.println("线程在跑");
}
}
}
比较:
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
基于TCP的Java网络编程
直接说代码
TCPServer作为服务端
package ChatServer;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//tcp通信的服务器端,接受客户端请求,读取客户端发送的数据
//表示服务器的类ServerSocket
//成员方法:socket accept
//服务器的实现步骤:
//创建服务器ServerSocket对象中的方法accept
public class TCPServer {
public static void main(String[] args) throws IOException {
//创建服务器对象serverSocket对象和系统要指定的端口号
ServerSocket server = new ServerSocket(8888) ;
//使用serverSocket对象的方法accept,获取到请求的客户端对象socket
Socket socket = server.accept() ;
//使用网络字节输入流InputStream对象中的方法read,读取客户端发送的数据
InputStream is = socket.getInputStream() ;
byte[] bytes = new byte[1024] ;
int len = is.read(bytes) ;
//打印接收到的客户端的数据
System.out.println(new String(bytes, 0, len));
//使用socket对象中的方法getOutputStream获取网络字节输出流
OutputStream os = socket.getOutputStream() ;
//使用网络字节输出流outputStream对象中的方法write给客户端回写数据
os.write("收到数据".getBytes()) ;
socket.close() ;
server.close() ;
}
}
TCPClient作为客户端
package ChatClient;
//java网络编程
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
//创建一个客户端对象socket,构造方法绑定服务器的IP地址和端口号
Socket socket = null;
try {
//使用网络字节输出流outputstream获取网络字节输出流outputstream对象
socket = new Socket("127.0.0.1", 8888);
} catch (IOException e) {
e.printStackTrace();
}
OutputStream os = null;
try {
//获取socket的输出流句柄
os = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
try {
//向服务端发送数据
os.write("你好服务器".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
//接收网络数据的socket句柄
InputStream is = socket.getInputStream() ;
//定义好缓冲区
byte[] bytes = new byte[1024] ;
//接受服务端的数据
int len = is.read(bytes) ;
System.out.println("接收到服务器回应:"+new String(bytes, 0, len));
os..close() ;
is.close() ;
socket.close() ;
}
}