程序的一次执行,称为进程,一个进程可以由一个或者多个线程组成,这些线程在逻辑上是同时执行的,并且是相互独立的,如果在一个进程中含有多个线程,就是多线程应用。
在Java中有两种方法来实现多线程:继承Thread类和实现Runnable接口。
publicclass A extends Thread{
publicvoid run() {
System.out.println("a");
System.out.println("aa");
}
}
////////////////////////////////////////////
publicclass C implements Runnable{
publicvoid run() {
System.out.println("c");
System.out.println("cc");
}
}
////////////////////////////////////////////
publicclass D {
publicstaticvoid main(String[] args) {
A a = new A();
a.start();
C c = new C();
new Thread(c).start();
System.out.println("main");
}
}
////////////////////////////////////////////
我们在用Eclipse调使D时,可以看到:
从上图中,可以很清晰看到该进程由三个线程组成,这样,我们很容易就实现了多线程。
////////////////////////////////////////////
在Java 中Socket通信是多线程的典型应用。设想有一个服务器,它可以接受多个客户端的请求,并且这些请求是并发的,这就是一个多线程应用。
新建服务器类:
publicclass Server extends Thread{
private Socket client;
public Server(Socket c) {
this.client = c;
}
publicvoid run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(client
.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
//处理客户端请求,直到客户端输入exit,结束服务
while (true) {
String str = in.readLine();
System.out.println(str);
out.println("has receive....");
out.flush();
if (str.equals("exit"))
break;
}
client.close();
} catch (IOException ex) {
} finally {
}
}
publicstaticvoid main(String[] args) throws IOException {
//(主线程)服务器监听5678端口,等待请求
ServerSocket server = new ServerSocket(5678);
while (true) {
//启动一个线程为客户端服务,(主线程)服务器继续监听5678端口,等待请求
Server thread = new Server(server.accept());
thread.start();
}
}
}
////////////////////////////////////////////
新建客户端类:
publicclass Client {
publicstaticvoid main(String[] args) throws UnknownHostException,
IOException {
//新建客户端,同时向服务器请求服务
Socket server = new Socket(InetAddress.getLocalHost(), 5678);
BufferedReader in = new BufferedReader(new InputStreamReader(server .getInputStream()));
PrintWriter out = new PrintWriter(server.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
//客户端向服务提出请求,直到exit结束请求
while (true) {
String str = wt.readLine();
out.println(str);
out.flush();
if (str.equals("exit")) {
break;
}
System.out.println(in.readLine());
}
server.close();
}
}