首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

一段JAVA代码,里头有一些提问,希望大家帮忙简答下

2013-07-01 
一段JAVA代码,里面有一些提问,希望大家帮忙简答下。package multhreadimport java.io.BufferedInputStream

一段JAVA代码,里面有一些提问,希望大家帮忙简答下。

package multhread;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

public class ThreadPoolTest {

public static void main(String[] args)
{
boolean flag = true;

try
{
//1,创建线程池
ExecutorService pool = Executors.newFixedThreadPool(10);

//2,创建服务器
ServerSocket server = new ServerSocket(12345);

System.out.println("开始监听");


while(flag)
{
//这里flag一直为真,也就是说这个程序会一直在这里循环
//不断的接受来到的信息??? 是如此么???
Socket socket = server.accept();
//execute之后,这个线程会运行么?
//我没有看到start,也没看到关闭.如果这样,进入了10个线程,那么这个线程池
//是不是就满了,无法再使用。
pool.execute(new ServerThread(socket));
}
//既然在flag里进行无限制的循环,那么这里的操作永远不会达到,还有意义么?
//难道在新的线程里,能够修改这个flag的值??让程序退出么 ?
server.close();
pool.shutdown();
}
catch(IOException e)
{
e.printStackTrace();
}

}
}

class ServerThread implements Runnable
{
private Socket socket = null;

ServerThread(Socket socket)
{
this.socket = socket;
}
public void run()
{
try
{
//客户端输入输出流
DataInputStream is = new DataInputStream
(new BufferedInputStream(socket.getInputStream()));

OutputStream os = socket.getOutputStream();

String inputLine;

//4, readLine() 为何会显示过时???
while((inputLine = is.readLine()) != null)
{
//输入bye的时候关闭连接
if(inputLine.equals("bye"))
{
break;
}
else
{
System.out.println(inputLine);
os.write(("reply:" + inputLine).getBytes());
}
}
is.close();
os.close();
socket.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}


[解决办法]
陋见在注释中


public class ThreadPoolTest {
 
    public static void main(String[] args)
    {
        boolean flag = true;
         
        try
        {
            //1,创建线程池
            ExecutorService pool = Executors.newFixedThreadPool(10);
             
            //2,创建服务器
            ServerSocket server = new ServerSocket(12345);
             
            System.out.println("开始监听");
             
             
            while(flag)
            {
                //这里flag一直为真,也就是说这个程序会一直在这里循环
                //不断的接受来到的信息??? 是如此么???
                //这里的accept操作会阻塞线程,等待客户端请求后,才会往下走。当然,因为while true的存在,多个客户端都发请求,都能处理的。
                Socket socket = server.accept();
                //execute之后,这个线程会运行么?//会执行的
                //我没有看到start,也没看到关闭.如果这样,进入了10个线程,那么这个线程池
                //是不是就满了,无法再使用。
                //API中有这么一段话:如果池中当前有多于 corePoolSize 的线程,则这些多出的线程在空闲时间超过 keepAliveTime 时将会终止
                //就是说,即使线程池满了,后续的线程如果在keepAliveTime实践内得到响应进入线程池,就不会失败。这里的keepAliveTime=0,所以满了就不能加了。


                pool.execute(new ServerThread(socket));
            }
            //既然在flag里进行无限制的循环,那么这里的操作永远不会达到,还有意义么?
            //难道在新的线程里,能够修改这个flag的值??让程序退出么 ?
            //理论上while true的模式,里面会有一个判断,符合一定条件就会break.这里目测走不到了。
            server.close();
            pool.shutdown();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
         
    }
}
 
class ServerThread implements Runnable
{
    private Socket socket = null;
     
    ServerThread(Socket socket)
    {
        this.socket = socket;
    }
    public void run()
    {
        try
        {
            //客户端输入输出流
            DataInputStream is = new DataInputStream
                    (new BufferedInputStream(socket.getInputStream()));
             
            OutputStream os = socket.getOutputStream();
             
            String inputLine;
             
            //4, readLine() 为何会显示过时???
            //过时的方法,肯定有更优的方法来替换的。API提示用BufferedReader.readLine() 替换。
            while((inputLine = is.readLine()) != null)


            {
                //输入bye的时候关闭连接
                if(inputLine.equals("bye"))
                {
                    break;
                }
                else
                {
                    System.out.println(inputLine);
                    os.write(("reply:" + inputLine).getBytes());
                }
            }
            is.close();
            os.close();
            socket.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}


热点排行