缘由:
在实际的应用中可能会出现这样一种尴尬:只有一个工作线程(这里叫单线程吧)处理大量的信息。而这些信息由线程池中的执行线程提供而来,起先想用线程同步的机制来实现,但这样子会出现了一些弊端:线程池中的线程会被卡住,直到这个单线程空闲才可以和这些线程池中的线程同步处理,这有违反当初设计这一线程池的目的。
工作内容:
1端信息输入
2端信息输入 提取信息 处理结果
3端信息输入 ———————— 用线程池处理 ———————— 交由单线程处理(只能有一个实例)
...
n端信息输入
于是在单线程里面实现信息缓存机制。
单线程类
MakeWork.java
package work;
import java.util.ArrayList;
import java.util.List;
/**
* 单线程 1、设置工作内容 2、自我唤醒功能 3、线程关闭
*/
public class MakeWork extends Thread
{
private boolean shutdown = false;
// 缓存列表
private List<String> list = new ArrayList<String>();
public void setMessage(String message)
{
synchronized (this)
{
list.add(message);
notify();
}
}
public void run()
{
while (!shutdown)
{
synchronized (this)
{
while (list.size() > 0)
{
String message = list.remove(0);
System.out.println("message: " + message);
}
}
try
{
wait();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
public void close()
{
synchronized (this)
{
this.shutdown = true;
this.notify();
}
}
}
Work.java
package work;
/**
* 虚拟线程池线程:将处理后返回的结果提交到单例线程
*/
public class Work
{
// 单线程对象
private MakeWork makeWork;
public Work(MakeWork makeWork)
{
this.makeWork = makeWork;
}
// 将处理后返回的结果提交到单例线程
public void work(String message)
{
makeWork.setMessage(message);
}
}
测试类:
Test.java
package test;
import java.util.Random;
import work.MakeWork;
import work.Work;
public class Test
{
/**
* @param args
*/
public static void main(String[] args)
{
MakeWork makeWork = new MakeWork();
makeWork.start();
// 虚拟1000个线程同时操作
for (int i = 0; i < 1000; i++)
{
Work workThread = new Work(makeWork);
workThread.work("do: " + i);
}
}
}
结果:
message: do: 0
message: do: 1
message: do: 2
message: do: 3
message: do: 4
message: do: 5
.
.
.
.
分享到:
相关推荐
1. **简化程序设计**:由于无需处理多线程间的竞争条件或死锁等问题,因此程序设计更加简单明了。 2. **易于调试**:单线程程序的调试相对容易,因为不存在多个线程之间复杂的交互情况。 3. **资源消耗少**:单线程...
因此,如果应用需要同时处理多个任务,单线程可能不是最佳选择。 相比之下,**多线程**允许程序同时执行多个线程,每个线程可以独立地执行任务。这使得程序能更有效地利用CPU资源,提高响应速度和并发能力。例如,...
2. **并发执行**:多线程可以在同一时间处理多个任务,而单线程需要等待一个任务完成后才能执行下一个。 3. **同步问题**:多线程中,由于共享资源可能导致数据竞争和死锁,需要进行线程同步,而单线程不存在这些...
总结来说,"单线程多任务uloop.zip"的讨论内容涵盖了libubox库的使用,特别是其提供的uloop框架,用于在单线程环境下实现非阻塞输入和多任务处理。通过理解并应用这些技术,开发者可以在资源有限的设备上构建出高效...
在计算机编程领域,单线程和多线程是两种处理任务执行的方式,它们涉及到操作系统如何管理程序的执行和资源分配。本篇文章将深入探讨这两种线程模型,以及它们各自的特点和应用场景。 首先,我们理解一下单线程的...
多线程意味着程序可以在同一时间执行多个不同的任务,而单线程则表示只有一个线程在执行任务。JavaScript最初被设计为在浏览器中运行,为了不影响用户界面的响应性,它选择了单线程模型。这意味着在任何时候,...
在Java编程中,任务线程处理是一种常见的并发编程模型,它允许我们利用多核处理器的优势,提高程序的执行效率。本示例将深入探讨如何在Java中实现基于任务的线程处理,包括线程的基本概念、任务调度以及队列的应用。...
在计算机科学领域,多核和单核处理器是两种常见的硬件架构,它们对多线程和单线程的处理方式有着显著的区别。理解这些特点对于优化软件性能和编写高效的代码至关重要。 首先,我们来探讨单线程。单线程是指一个程序...
在本文中,我们将深入探讨如何构建一个简单的单线程聊天系统,主要关注GUI编程、单线程处理以及输入输出流的使用。这个系统的运作方式是客户端1与服务器通信,然后服务器将消息转发给客户端2,客户端2再回应,如此...
在IT行业中,线程是程序执行的基本单元,它与进程并行运行,使得程序能够同时处理多个任务。在单线程编程中,所有任务都按照顺序执行,而多线程编程则允许多个任务在同一时间片内并发执行,极大地提高了程序的效率和...
这种多线程处理方式可以大大提高相机图像处理的效率和速度,使得相机可以更快地处理和分析图像数据,提高图像处理的精度和准确性。同时,多线程处理还可以避免互相干扰,提高系统的稳定性和实时性。本资源提供一个...
本文主要探讨的是如何在Android平台上实现单线程和多线程下载,这是一项重要的技术,尤其在处理大文件或者需要后台持续运行的任务时。我们将从源码分析、工具应用等方面进行详细讲解。 首先,我们了解下Android中的...
虽然简单易懂,但单线程在处理I/O密集型或计算密集型任务时可能会导致阻塞,降低程序的响应速度。例如,如果一个任务正在执行耗时的磁盘读写操作,用户界面可能会暂时冻结,直到该任务完成。 **多线程** 多线程则...
本文将深入探讨易语言编程环境、多线程技术和多任务处理在软件开发中的应用。 首先,易语言是中国本土开发的一种面向对象的编程语言,以其“易学易用”的特点受到初学者和专业开发者喜爱。它采用中文语法,降低了...
然而,在某些情况下,例如使用COM组件(如ActiveX控件),我们可能需要在单线程应用程序中实现线程安全的多任务处理,这就需要用到单线程公寓(Single Threaded Apartment, STA)模型。 描述中提到的“把单线程中的...
3. **线程池**:线程池是一种优化的多线程处理方式。它预先创建一定数量的线程,用于处理任务。当有新任务到来时,线程池会分配空闲线程执行任务,而不是每次都创建新线程。这减少了线程创建和销毁的开销,提高了...
本资源“C#单线程及多线程演示”提供了详细的源码和注释,非常适合初学者学习和理解。 首先,让我们了解一下单线程。在C#中,每个进程默认都有一个主线程,它负责执行程序的入口点(Main方法)。单线程意味着所有的...
在计算机编程领域,多线程和单线程是两种不同的执行模式,特别是在Windows操作系统中,`CreateThread`函数被广泛用于创建线程。本篇文章将深入探讨这两种模式的区别,以及如何利用`CreateThread`实现多线程。 首先...
在单线程程序中,所有代码都在同一个线程内运行,而多线程则允许多个任务同时进行。对于初学者来说,理解单线程编程是学习多线程和并发编程的基础。 在VC中,可以使用Windows API函数或者C++标准库中的`<thread>`来...