多線程
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() ;
}
}