要用java实现多线程的文件上传该如何去做?

要用java实现多线程的文件上传该如何去做?,第1张

的资源消耗,因此,在进行同类事情,需要进行互相的通讯等等事情的时候,都采用线程来进行处理。

对于只做固定的一件事情(比如:计算1+2+3+...+9999999)来说,其性能上不会比采用单线程的整体效率高,原因是,同时都是要做这么多运算,采用多线程的话,系统在进行线程调度的过程中喙浪费一些资源和时间,从而性能上下降。

那么,多线程是否就没有存在的意义了呢?答案当然不是的。多线程还是有存在的价值的,我们在写输入流输出流,写网络程序等等的时候,都会出现阻塞的情况,如果说,我们不使用多线程的话,从A中读数据出来的时候,A因为没有准备好,而整个程序阻塞了,其他的任何事情都没法进行。如果采用多线程的话,你就不用担心这个问题了。还举个例子:游戏中,如果A角色和B角色采用同一个线程来处理的话,那么,很有可能就会出现只会响应A角色的 *** 作,而B角色就始终被占用了的情况,这样,玩起来肯定就没劲了。

因此,线程是有用的,但也不是随便乱用,乱用的话,可能造成性能的低下,它是有一点的适用范围的,一般我认为:需要响应多个人的事情,从设计上需要考虑同时做一些事情(这些事情很多情况下可能一点关系都没有,也有可能有一些关系的)。

使用多线程的时候,如果某些线程之间涉及到资源共享、互相通讯等等问题的时候,一定得注意线程安全的问题,根据情况看是不是需要使用synchronized关键字。

另外,站长团上有产品团购,便宜有保证

程序分Server和Client

服务器端打开侦听的端口,一有客户端连接就创建两个新的线程来负责这个连接

一个负责客户端发送的信息(ClientMsgCollectThread 类),

另一个负责通过该Socket发送数据(ServerMsgSendThread )

Server.java代码如下:

/*

* 创建日期 2009-3-7

*

* TODO 要更改此生成的文件的模板,请转至

* 窗口 - 首选项 - Java - 代码样式 - 代码模板

*/

package faue.MutiUser

import java.io.BufferedReader

import java.io.IOException

import java.io.InputStreamReader

import java.io.PrintWriter

import java.net.ServerSocket

import java.net.Socket

/**

* 服务器端

*

* @author Faue

*/

public class Server extends ServerSocket {

private static final int SERVER_PORT = 10000

/**

* 构造方法,用于实现连接的监听

*

* @throws IOException

*/

public Server() throws IOException {

super(SERVER_PORT)

try {

while (true) {

Socket socket = super.accept()

new Thread(new ClientMsgCollectThread(socket), "getAndShow"

+ socket.getPort()).start()

new Thread(new ServerMsgSendThread(socket), "send"

+ socket.getPort()).start()

}

} catch (IOException e) {

e.printStackTrace()

}

}

public static void main(String[] args) throws IOException {

new Server()

}

/**

* 该类用于创建接收客户端发来的信息并显示的线程

*

* @author Faue

* @version 1.0.0

*/

class ClientMsgCollectThread implements Runnable {

private Socket client

private BufferedReader in

private StringBuffer inputStringBuffer = new StringBuffer("Hello")

/**

* 得到Socket的输入流

*

* @param s

* @throws IOException

*/

public ClientMsgCollectThread(Socket s) throws IOException {

client = s

in = new BufferedReader(new InputStreamReader(client

.getInputStream(), "GBK"))

}

public void run() {

try {

while (!client.isClosed()) {

inputStringBuffer.delete(0, inputStringBuffer.length())

inputStringBuffer.append(in.readLine())

System.out.println(getMsg(inputStringBuffer.toString()))

}

} catch (IOException e) {

//e.printStackTrace()

System.out.println(client.toString() + " is closed!")

}

}

/**

* 构造显示的字符串

*

* @param line

* @return

*/

private String getMsg(String line) {

return client.toString() + " says:" + line

}

}

/**

* 该类用于创建发送数据的线程

*

* @author Faue

* @version 1.0.0

*/

class ServerMsgSendThread implements Runnable {

private Socket client

private PrintWriter out

private BufferedReader keyboardInput

private StringBuffer outputStringBuffer = new StringBuffer("Hello")

/**

* 得到键盘的输入流

*

* @param s

* @throws IOException

*/

public ServerMsgSendThread(Socket s) throws IOException {

client = s

out = new PrintWriter(client.getOutputStream(), true)

keyboardInput = new BufferedReader(new InputStreamReader(System.in))

}

public void run() {

try {

while (!client.isClosed()) {

outputStringBuffer.delete(0, outputStringBuffer.length())

outputStringBuffer.append(keyboardInput.readLine())

out.println(outputStringBuffer.toString())

}

} catch (IOException e) {

//e.printStackTrace()

System.out.println(client.toString() + " is closed!")

}

}

}

}

客户端:

实现基于IP地址的连接,连接后也创建两个线程来实现信息的发送和接收

/*

* 创建日期 2009-3-7

*

*/

package faue.MutiUser

import java.io.BufferedReader

import java.io.IOException

import java.io.InputStreamReader

import java.io.PrintWriter

import java.net.Socket

/**

* 客户端

*

* @author Faue

*/

public class Client {

private Socket mySocket

/**

* 创建线程的构造方法

*

* @param IP

* @throws IOException

*/

public Client(String IP) throws IOException {

try {

mySocket = new Socket(IP, 10000)

new Thread(new ServerMsgCollectThread(mySocket), "getAndShow"

+ mySocket.getPort()).start()

new Thread(new ClientMsgSendThread(mySocket), "send"

+ mySocket.getPort()).start()

} catch (IOException e) {

//e.printStackTrace()

System.out.println("Server.IP:" + IP

+ " port:10000 can not be Connected")

}

}

public static void main(String[] args) throws IOException {

try {

new Client(args[0])

} catch (Exception e) {

System.out.println("输入的IP地址错误")

}

}

/**

* 该类用于创建接收服务端发来的信息并显示的线程

*

* @author Faue

* @version 1.0.0

*/

class ServerMsgCollectThread implements Runnable {

private Socket client

private BufferedReader in

private StringBuffer inputStringBuffer = new StringBuffer("Hello")

/**

* 得到Socket的输入流

*

* @param s

* @throws IOException

*/

public ServerMsgCollectThread(Socket s) throws IOException {

client = s

in = new BufferedReader(new InputStreamReader(client

.getInputStream(), "GBK"))

}

public void run() {

try {

while (!client.isClosed()) {

inputStringBuffer.delete(0, inputStringBuffer.length())

inputStringBuffer.append(in.readLine())

System.out.println(getMsg(inputStringBuffer.toString()))

}

} catch (IOException e) {

//e.printStackTrace()

System.out.println(client.toString() + " is closed!")

System.exit(0)

}

}

/**

* 构造输入字符串

*

* @param line

* @return

*/

private String getMsg(String line) {

return client.toString() + " says:" + line

}

}

/**

* 该类用于创建发送数据的线程

*

* @author Faue

* @version 1.0.0

*/

class ClientMsgSendThread implements Runnable {

private Socket client

private PrintWriter out

private BufferedReader keyboardInput

private StringBuffer outputStringBuffer = new StringBuffer("Hello")

/**

* 得到键盘的输入流

*

* @param s

* @throws IOException

*/

public ClientMsgSendThread(Socket s) throws IOException {

client = s

out = new PrintWriter(client.getOutputStream(), true)

keyboardInput = new BufferedReader(new InputStreamReader(System.in))

}

public void run() {

try {

while (!client.isClosed()) {

outputStringBuffer.delete(0, outputStringBuffer.length())

outputStringBuffer.append(keyboardInput.readLine())

out.println(outputStringBuffer.toString())

}

out.println("--- See you, bye! ---")

} catch (IOException e) {

//e.printStackTrace()

System.out.println(client.toString() + " is closed!")

System.exit(0)

}

}

}

}

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!

vaela

单线程程序的执行时一步一步的走,第一步完成了,才开始做第二步。举个例子,我的一个程序的目的是查询一张表的所有数据用java的窗体将数据展示出来,没用多线程的话,我会先查数据,必须在查完之后,在渲染窗体,打开这个窗体界面。假如数据量大的话,我运行程序了几分钟都没什么反应。 这时我可以开一条线程去查询数据,打开窗体,和查询数据同时进行,这样做的话增强利用率,节约时间。不用多线程的话,程序必定会先执行完一个步骤才会去执行下一步

如图


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11586711.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存