程序的一次执行,称为进程,一个进程可以由一个或者多个线程组成,这些线程在逻辑上是同时执行的,并且是相互独立的,如果在一个进程中含有多个线程,就是多线程应用。
在Java中有两种方法来实现多线程:继承Thread类和实现Runnable接口。
public
class
A
extends
Thread{
public
void
run() {
System.
out
.println(
"a"
);
System.
out
.println(
"aa"
);
}
}
public
class
C
implements
Runnable{
public
void
run() {
System.
out
.println(
"c"
);
System.
out
.println(
"cc"
);
}
}
public
class
D {
public
static
void
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通信是多线程的典型应用。设想有一个服务器,它可以接受多个客户端的请求,并且这些请求是并发的,这就是一个多线程应用。
新建服务器类:
public
class
Server
extends
Thread{
private
Socket
client
;
public
Server(Socket c) {
this
.
client
= c;
}
public
void
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
{
}
}
public
static
void
main(String[] args)
throws
IOException {
//
(主线程)服务器监听
5678
端口,等待请求
ServerSocket server =
new
ServerSocket(5678);
while
(
true
) {
//
启动一个线程为客户端服务,(主线程)服务器继续监听
5678
端口,等待请求
Server thread =
new
Server(server.accept());
thread.start();
}
}
}
新建客户端类:
public
class
Client {
public
static
void
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();
}
}