小弟请教各位一个问题:
有一个主线程,主线程里有一个子线程组(大概8个子线程)。逻辑是主线程每一次从数据库里取一批数据,并分发给线程内部的子线程去进行去对外发送。并可以知道发送的次数。在主程在数据里取数据已经完成之后,那就停止线程。
本人已经写了一个代码,不过还是有问题。各位大侠,请。
package com.thread;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
public class MultiThread2 extends Thread {
private static Logger logger = Logger.getLogger(MultiThread2.class);
// 加一些基础信息,让WEB页面可以刷新的时候可以看到发送状态
//
private String requestData = null;
private Object lock;
private Object submitLock;
private Object startLock;
//private Object stopLock;
private InnerThread[] innerThreads;
private boolean tag = true;
public MultiThread2() {
try {
lock = new Object();
submitLock = new Object();
startLock = new Object();
int maxThreadNum = 3;
innerThreads = new InnerThread[maxThreadNum];
} catch (Exception e) {
logger.info("创建线程失败:" + e.getMessage());
}
}
public void startThread() {
synchronized (startLock) {
if (tag) {
for (int i = 0; i < innerThreads.length; i++) {
innerThreads[i] = new InnerThread(this);
innerThreads[i].start();
}
this.start();// 启动主线程
}
}
}
public void stopInnerThread(){
for (int i = 0; i < innerThreads.length; i++) {
innerThreads[i].interrupt();
}
this.interrupt();
}
public void submitRequest(InnerThread innerThread)
throws InterruptedException {
synchronized (submitLock) {
while (tag) {
synchronized (this) {
if (this.requestData != null) {
innerThread.setXmlRequestData(requestData);
this.requestData = null;
this.notify();
break;
} else {
this.wait();
}
}
}
}
}
public void run() {// 主线程
List markList = new ArrayList();
setValue2List(markList);
while (tag) {
// 取出一部分数据提交
logger.info("记录数:" + markList.size());
Iterator itr = markList.iterator();
while (itr.hasNext() && tag) {
String value = (String) itr.next();
itr.remove();
if (value != null) {
try {
// 控制速度
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock) {
while (tag) {
synchronized (this) {
if (this.requestData == null) {
this.requestData = value;
logger.info("将要发送的值是:"+value);
this.notify();
break;
} else {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}// synchronized(lock)
}// vo != null
}// while(itr.hasNext())
try {
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tag = false;
//stopInnerThread();
}
}
private void setValue2List(List markList) {
markList.add("记录1");
markList.add("记录2");
markList.add("记录3");
markList.add("记录4");
markList.add("记录5");
// markList.add("记录6");
// markList.add("记录7");
// markList.add("记录8");
// markList.add("记录9");
// markList.add("记录10");
// markList.add("记录11");
// markList.add("记录12");
// markList.add("记录13");
// markList.add("记录14");
// markList.add("记录15");
}
class InnerThread extends Thread {
private String xmlRequestData = null;
private MultiThread2 multiThread;
public InnerThread(MultiThread2 multiThread) {
this.multiThread = multiThread;
}
public void run() {
while (tag) {
try {
multiThread.submitRequest(this);
} catch (InterruptedException e) {
return;
}
//logger.info("----------->>>>>>>>>>>出现多少次,就发送多少次<<<<<<<<<<<----------");
// int resendCount = 0;
// boolean sendOk = false;
// Random random = new Random(3);
logger.info("发送值是(xmlRequestData) = " + xmlRequestData);
if (xmlRequestData!=null && xmlRequestData.equals("")){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// while (!sendOk && resendCount < 3) {
// int i = random.nextInt();
// if (i == 1) {
// sendOk = true;
// } else {
// resendCount++;
// logger.info("随机数 i = " + i + " 重试次数:" + resendCount
// + " xmlRequestData = "+xmlRequestData);
// }
// }
}
}
public void setXmlRequestData(String xmlRequestData) {
this.xmlRequestData = xmlRequestData;
}
}
public static void main(String[] args) {
MultiThread2 t = new MultiThread2();
t.startThread();
}
public boolean isTag() {
return tag;
}
public void setTag(boolean tag) {
this.tag = tag;
}
}
分享到:
相关推荐
另外,分批处理(Batch Processing)是一种常见的优化技巧,将大任务拆分成多个小批次,每次只处理一部分数据,这样既可以降低内存占用,又可以降低数据库压力。 在C#中,可以结合ADO.NET库进行数据库操作。`...
在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 一、Spring MVC与并发处理 1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将...
6. 性能优化:源码可能包含各种性能优化技巧,如缓存策略、I/O优化、内存管理和并发控制,这些都是处理大规模数据流的关键。 7. 错误处理与容错性:数据流处理中,系统必须具备一定的错误恢复能力。源码可能会展示...
线程池是一种管理线程的方法,它预先创建一组线程,当有任务到来时,任务被分发到空闲线程中执行。这可以减少线程创建和销毁的开销,提高系统效率。 9. **并发容器** C++11引入的并发容器如`std::atomic`、`std::...
乒乓缓存(Ping-Pong Buffer)是一种在计算机编程中用于优化数据传输和处理的技术,尤其在实时系统或者需要高效内存管理的场景下被广泛应用。它通过利用两个或多个交替使用的缓冲区来避免数据读写过程中的等待时间,...
因此,多线程并发编程成为提升程序性能的关键技术之一。 Java内存模型(Java Memory Model,JMM)为了解决在不同硬件和虚拟机实现上的内存访问差异而被制定,它保证了Java程序在不同平台上能够拥有相同的内存访问...
这个项目的目标是建立一个服务器,能够直接从网络上的IP摄像头获取实时视频数据,并将这些数据转发给多个客户端。 RTSP是一种应用层协议,用于控制媒体的播放,如视频和音频流。它允许客户端(例如视频播放器)远程...
处理完成后,控制线程会将需要响应的数据和写通道提交给写线程池,由写线程池中的某个线程负责将数据发送给客户端。 #### 事件模型组件详解 - **监听器(Serverlistener)**:定义了一系列服务器事件的接口,包括on...
这个新线程会不断地读取串口的数据,并可能使用回调函数或者事件队列将接收到的数据传递到主线程进行处理。例如: ```cpp void SerialPort::startListening() { if (!m_listenerThread.joinable()) { m_...
在IT行业中,高并发访问是网站和应用程序设计中不可或缺的一部分,尤其对于大型互联网服务来说,如何有效处理大量的并发请求是一项关键技术挑战。本话题将聚焦于如何利用PHP自带的函数进行批处理URL访问,以模拟高...
在Java编程领域,高并发处理是一项至关重要的技术,特别是在构建大型、高性能的互联网应用时。本文将基于"java 高并发解决思路"这一主题,深入探讨相关知识点,并结合"高并发web架构.pdf"文档中的实例进行阐述。 1....
在IT行业中,主从reactor模式是一种常用的多线程并发处理模型,特别是在网络编程和事件驱动的系统设计中。这个模式被广泛应用于高并发、低延迟的系统,如服务器端应用,例如Nginx和Redis等。下面我们将深入探讨主从...
标题“Mer-No.04 board各省份MSISDN数据出错处理”暗示了这是一个关于解决特定硬件板(Mer-No.04 board)在处理不同省份的MSISDN(Mobile Station International Subscriber Directory Number,即移动用户国际识别码...
- **消息处理线程**:在服务器端接收并分发消息到所有在线的客户端。 2. **Socket编程**:Java的`java.net.Socket`和`ServerSocket`类用于实现客户端-服务器通信。服务器端创建`ServerSocket`来监听客户端的连接...
当主线程空闲时,事件循环会检查队列,并将任务分发到相应的回调函数进行处理。 在JavaScript中,任务队列分为宏任务(Macrotask)和微任务(Microtask)。宏任务包括:script(整体代码)、setTimeout、...
本示例主要关注的是利用多线程和UDP协议进行文件传输,这是一种相对复杂的操作,涉及到并发处理、网络编程以及数据可靠性等多个方面。 首先,我们来了解多线程的概念。多线程是指在一个程序中存在多个执行流,这些...
当有新的连接请求或数据需要读写时,事件驱动的 I/O 复用器会将这些事件分发给工作线程进行处理。这样,主线程只需要关注命令的执行,而 I/O 操作由多个线程并行处理,提高了并发能力。 **4. C/C++ 开发** Redis 的...
总结来说,"多线程web服务器"是一种能够同时处理多个客户端请求的网络服务程序,它利用Java的多线程特性,通过主线程监听和分发请求,工作线程处理请求,配合并发工具实现高效、稳定的运行。在实现过程中,需要注意...
在计算机编程中,多线程是并发处理的一种方式,它允许多个任务同时执行,从而提高程序的执行速度。在文件拷贝场景下,如果一个文件夹包含大量小文件,传统的单线程拷贝方式可能会因为频繁的文件系统操作而显得效率...
当一个客户端发送消息时,对应的线程会负责读取输入、打包数据,并通过Socket发送到服务器;反之,当接收到服务器的数据时,该线程也会负责解包并显示在客户端界面上。 其次,Socket是Java中实现网络通信的基础,它...