副标题#e#
12.3.2 模仿网络数据发送
在实际的网络措施开拓中,由于网络通讯一般都需要耗损时间,所以网络通讯的内容一般都启动专门的线程举办处理惩罚。
这样,在一个最简朴的网络措施措施中,至少就包括了两个线程:处理惩罚界面绘制和吸收用户输入的系统线程,以及至少一个网络通讯线程。
下面以一个简朴的模仿措施,实现模仿网络数据的发送成果,关于更具体的网络编程中线程的利用,可以参看后续的网络编程章节。
在该示例代码中,用户在节制台输入需要发送的内容,措施吸收到用户的输入今后,启动一个单独的线程举办网络通讯,然后用户可以继承在节制台举办输入。示例代码如下所示:
package example2;
import java.io.*;
/**
* 模仿网络数据发送的测试类
*/
public class TestNet {
public static void main(String[] args) {
BufferedReader br = null;
String input;
try{
//初始化输入流
br = new BufferedReader(
new InputStreamReader(System.in));
//轮回吸收输入
while(true){
System.out.println("请输入内容(quit代表退出措施):");
//读取节制台输入
input = br.readLine();
//判定是否是竣事
if(input.equals("quit")){
break; //竣事措施
}
//模仿发送
NetDemoThread ndt = new NetDemoThread(input);
}
}catch(Exception e){
}finally{
try {
br.close();
} catch (Exception e) {}
}
}
}
package example2;
/**
* 通过担任Thread类的方法模仿网络通讯线程
*/
public class NetDemoThread extends Thread {
String data;
public NetDemoThread(String data){
this.data = data;
start();
}
public void run(){
try{
System.out.println("开始发送");
Thread.sleep(10000); //模仿网络发送的延迟
System.out.println("发送完成,发送的内容是:" + data);
}catch(Exception e){}
}
}
#p#副标题#e#
在该示例中,TestNet类实现吸收节制台输入,并在吸收到用户输入今后,启动网络通讯线程发送数据,当用户在节制台输入quit时,竣事措施。NetDemoThread类实现模仿网络通讯线程,在需要发送网络数据时,建设一个NetDemoThread范例的线程工具,并将需要发送的内容作为参数传入到该工具的内容,在run要领中,输出线程的状态,并利用一个延迟10秒,比实际的延迟要夸大许多,的代码模仿发送时的线程延迟。由于这里的延迟较量大,所以假如用户输入的数据速度较量快的话,会存在多个网络通讯的线程同时运行。
下面是措施的运行功效:
请输入内容(quit代表退出措施):
abc
请输入内容(quit代表退出措施):
开始发送
123
请输入内容(quit代表退出措施):
开始发送
tbc
请输入内容(quit代表退出措施):
开始发送
faga
请输入内容(quit代表退出措施):
开始发送
发送完成,发送的内容是:abc
hfsd
请输入内容(quit代表退出措施):
开始发送
发送完成,发送的内容是:123
发送完成,发送的内容是:tbc
发送完成,发送的内容是:faga
发送完成,发送的内容是:hfsd
quit
在该次运行中,用户依次输入了:123、tbc、faga和hfsd,当用户输入完成今后,模仿网络通讯的线程就被启动,这个可以从输出“开始发送”语句看出,当内容发送完成今后线程自然竣事。最后输入quit指令竣事措施。
虽然,该措施会在用户输入的内容差异时呈现许多差异的功效,这些功效可以或许使你体会到两点:
1、多个网络通讯的线程在同时事情,互不滋扰。
2、当输入quit今后,假如尚有网络通讯的线程没有竣事,则措施会期待到网络通讯的线程竣事今后才真正竣事。
虽然,这两个简朴的例子只可以或许使你熟悉根基的多线程编程的利用,还没有进入到多线程编程的焦点。
其实,当多线程一起运行时,除了带来一系列的优势以外,还会带来一系列的问题。譬喻现实社会中,一个儿子担任遗产时就很简朴,可是当有多个儿子呢?所以,下面来深入线程的观念,领略多线程编程存在的问题以及办理步伐。