PrintWriter.println线程打满
时间: 2024-06-11 21:04:17 浏览: 11
如果在使用PrintWriter.println时线程打满,这可能是因为:
1. PrintWriter实例被多个线程共享,导致多个线程同时向同一个输出流写入数据,从而导致线程竞争和阻塞。
2. 输出流被阻塞,无法及时处理写入的数据,从而导致线程阻塞等待。
为了解决这个问题,可以采取以下措施:
1. 将PrintWriter实例的访问限制为单个线程,以避免多个线程同时对同一个输出流进行写入。
2. 使用缓冲输出流(如BufferedWriter)来缓存写入数据,以提高输出流的效率。
3. 使用线程池来管理线程,以避免过多的线程同时向输出流写入数据。
相关问题
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ipEditText = findViewById(R.id.ipEditText); portEditText = findViewById(R.id.portEditText); Button connectButton = findViewById(R.id.connectButton); connectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String ip = ipEditText.getText().toString(); int port = Integer.parseInt(portEditText.getText().toString()); new ConnectTask().execute(ip, String.valueOf(port)); } }); Button sendMessageButton = findViewById(R.id.sendMessageButton); sendMessageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showSendMessageDialog(); } }); }出现E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.rlswj, PID: 16184 android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1668) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116) at java.net.SocketOutputStream.write(SocketOutputStream.java:161) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291) at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295) at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141) at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) at java.io.BufferedWriter.flush(BufferedWriter.java:254) at java.io.PrintWriter.newLine(PrintWriter.java:482) at java.io.PrintWriter.println(PrintWriter.java:629) at java.io.PrintWriter.println(PrintWriter.java:670)
这个错误信息与你之前提到的错误信息相同,都是由于在主线程中进行了网络操作导致的。你需要将网络操作放到单独的线程或使用异步任务来执行,例如在 `ConnectTask` 中执行网络操作,而不是在主线程中执行。在 `ConnectTask` 的 `doInBackground` 方法中执行网络操作,然后在 `onPostExecute` 方法中更新 UI。
package 第十一讲_网络编程; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.SocketException; public class ChatClient extends Thread{ Socket sc;// 对象sc,用来处理与服务器的通信 BufferedReader in;// 声明输入流缓冲区,用于存储服务器发来的信息 PrintWriter out;// 声明打印输出流,用于信息的发送 TcpClientUI ui; public ChatClient(String ip, int port, TcpClientUI ui) {// 初始化ChatClient类 this.ui = ui; try { // 创建sc, 用服务器ip和端口作参数 System.out.println("已顺利联接到服务器。"); //创建输入输出流对象 } catch (Exception e) { System.out.println(e); } start();//启动线程 } public void run() { // 用于监听服务器端发送来的信息 String msg = ""; while (true) { try { msg=in.readLine();// 从缓冲区读入一行字符存于msg } catch (SocketException ex) { System.out.println(ex); break; } catch (Exception ex) { System.out.println(ex); } if (msg != null && msg.trim() != "") {// 若msg信息不为空 System.out.println(">>" + msg); ui.mainArea.append(msg + "\n");// 把msg信息添加到客户端的文本区域内 } } } public void sendMsg(String msg) {// 用于发送信息 try { out.println("【客户端】" + msg); } catch (Exception e) { System.out.println(e); } } }
这段代码是一个Java语言实现的简单聊天室客户端程序,实现了与服务器的通信和信息的发送、接收。以下是代码注释:
```java
package 第十一讲_网络编程;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketException;
public class ChatClient extends Thread{
Socket sc;// 对象sc,用来处理与服务器的通信
BufferedReader in;// 声明输入流缓冲区,用于存储服务器发来的信息
PrintWriter out;// 声明打印输出流,用于信息的发送
TcpClientUI ui;
public ChatClient(String ip, int port, TcpClientUI ui) {// 初始化ChatClient类
this.ui = ui;
try {
// 创建sc, 用服务器ip和端口作参数
sc = new Socket(ip, port);
System.out.println("已顺利联接到服务器。");
//创建输入输出流对象
in = new BufferedReader(new InputStreamReader(sc.getInputStream()));
out = new PrintWriter(sc.getOutputStream(), true);
} catch (Exception e) {
System.out.println(e);
}
start();//启动线程
}
public void run() { // 用于监听服务器端发送来的信息
String msg = "";
while (true) {
try {
msg=in.readLine();// 从缓冲区读入一行字符存于msg
} catch (SocketException ex) {
System.out.println(ex);
break;
} catch (Exception ex) {
System.out.println(ex);
}
if (msg != null && msg.trim() != "") {// 若msg信息不为空
System.out.println(">>" + msg);
ui.mainArea.append(msg + "\n");// 把msg信息添加到客户端的文本区域内
}
}
}
public void sendMsg(String msg) {// 用于发送信息
try {
out.println("【客户端】" + msg);
} catch (Exception e) {
System.out.println(e);
}
}
}
```
其中,ChatClient类继承自Thread类,实现了多线程的功能,在启动时会创建一个Socket对象,与指定的服务器IP和端口进行连接。在连接成功后,会创建输入输出流对象,用于接收和发送信息。run()方法中,通过循环不断监听服务器端发送的信息,如果有信息则会显示在客户端的文本区域内。sendMsg()方法用于发送信息给服务器端。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)