`
joknm
  • 浏览: 62462 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

单线程处理多任务处理方式

    博客分类:
  • JAVA
阅读更多
缘由:
    在实际的应用中可能会出现这样一种尴尬:只有一个工作线程(这里叫单线程吧)处理大量的信息。而这些信息由线程池中的执行线程提供而来,起先想用线程同步的机制来实现,但这样子会出现了一些弊端:线程池中的线程会被卡住,直到这个单线程空闲才可以和这些线程池中的线程同步处理,这有违反当初设计这一线程池的目的。
   
  工作内容:
    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
    .
    .
    .
    .

分享到:
评论
6 楼 mikeandmore 2009-12-31  
太山寨了,这种情况应该用coroutine
5 楼 joknm 2009-12-30  
强强爱妍妍 写道
随便看一眼就错了
        synchronized (this)  
        {  
            synchronized (list)  
            {  
...
}
}

list是private方法,外人访问不到. 必然是通过this来访问. 既然已经synchronized了this,就不用再synchronized(list)了


多谢指正
4 楼 shadowlin 2009-12-29  
理解不能啊
3 楼 ywlqi 2009-12-29  
不明白LZ想表达什么。。。
2 楼 shinezhou 2009-12-29  
这个有什么意义吗?
1 楼 强强爱妍妍 2009-12-28  
随便看一眼就错了
        synchronized (this)  
        {  
            synchronized (list)  
            {  
...
}
}

list是private方法,外人访问不到. 必然是通过this来访问. 既然已经synchronized了this,就不用再synchronized(list)了

相关推荐

    JAVA单线程多线程

    1. **简化程序设计**:由于无需处理多线程间的竞争条件或死锁等问题,因此程序设计更加简单明了。 2. **易于调试**:单线程程序的调试相对容易,因为不存在多个线程之间复杂的交互情况。 3. **资源消耗少**:单线程...

    单线程与多线程的区别

    因此,如果应用需要同时处理多个任务,单线程可能不是最佳选择。 相比之下,**多线程**允许程序同时执行多个线程,每个线程可以独立地执行任务。这使得程序能更有效地利用CPU资源,提高响应速度和并发能力。例如,...

    C#单线程与多线程实例

    2. **并发执行**:多线程可以在同一时间处理多个任务,而单线程需要等待一个任务完成后才能执行下一个。 3. **同步问题**:多线程中,由于共享资源可能导致数据竞争和死锁,需要进行线程同步,而单线程不存在这些...

    单线程多任务uloop.zip

    总结来说,"单线程多任务uloop.zip"的讨论内容涵盖了libubox库的使用,特别是其提供的uloop框架,用于在单线程环境下实现非阻塞输入和多任务处理。通过理解并应用这些技术,开发者可以在资源有限的设备上构建出高效...

    单线程与多线程

    在计算机编程领域,单线程和多线程是两种处理任务执行的方式,它们涉及到操作系统如何管理程序的执行和资源分配。本篇文章将深入探讨这两种线程模型,以及它们各自的特点和应用场景。 首先,我们理解一下单线程的...

    JavaScript单线程还是多线程

    多线程意味着程序可以在同一时间执行多个不同的任务,而单线程则表示只有一个线程在执行任务。JavaScript最初被设计为在浏览器中运行,为了不影响用户界面的响应性,它选择了单线程模型。这意味着在任何时候,...

    基于任务线程处理例子

    在Java编程中,任务线程处理是一种常见的并发编程模型,它允许我们利用多核处理器的优势,提高程序的执行效率。本示例将深入探讨如何在Java中实现基于任务的线程处理,包括线程的基本概念、任务调度以及队列的应用。...

    多核和单核中多线程及单线程的特点

    在计算机科学领域,多核和单核处理器是两种常见的硬件架构,它们对多线程和单线程的处理方式有着显著的区别。理解这些特点对于优化软件性能和编写高效的代码至关重要。 首先,我们来探讨单线程。单线程是指一个程序...

    单线程聊天系统

    在本文中,我们将深入探讨如何构建一个简单的单线程聊天系统,主要关注GUI编程、单线程处理以及输入输出流的使用。这个系统的运作方式是客户端1与服务器通信,然后服务器将消息转发给客户端2,客户端2再回应,如此...

    易语言源码多线程多任务下载软件.rar

    本文将深入探讨易语言编程环境、多线程技术和多任务处理在软件开发中的应用。 首先,易语言是中国本土开发的一种面向对象的编程语言,以其“易学易用”的特点受到初学者和专业开发者喜爱。它采用中文语法,降低了...

    android 单线程 多线程下载

    本文主要探讨的是如何在Android平台上实现单线程和多线程下载,这是一项重要的技术,尤其在处理大文件或者需要后台持续运行的任务时。我们将从源码分析、工具应用等方面进行详细讲解。 首先,我们了解下Android中的...

    VC++多线程与单线程

    虽然简单易懂,但单线程在处理I/O密集型或计算密集型任务时可能会导致阻塞,降低程序的响应速度。例如,如果一个任务正在执行耗时的磁盘读写操作,用户界面可能会暂时冻结,直到该任务完成。 **多线程** 多线程则...

    【源码】[疑难]在单线程中模拟多线程的工作模式

    然而,在某些情况下,例如使用COM组件(如ActiveX控件),我们可能需要在单线程应用程序中实现线程安全的多任务处理,这就需要用到单线程公寓(Single Threaded Apartment, STA)模型。 描述中提到的“把单线程中的...

    三个分别由单线程 多线程 线程池实现的简单网关

    3. **线程池**:线程池是一种优化的多线程处理方式。它预先创建一定数量的线程,用于处理任务。当有新任务到来时,线程池会分配空闲线程执行任务,而不是每次都创建新线程。这减少了线程创建和销毁的开销,提高了...

    C#单线程及多线程演示。详细注释 源码

    本资源“C#单线程及多线程演示”提供了详细的源码和注释,非常适合初学者学习和理解。 首先,让我们了解一下单线程。在C#中,每个进程默认都有一个主线程,它负责执行程序的入口点(Main方法)。单线程意味着所有的...

    多线程与单线程的对比(采用CreateThread)

    在计算机编程领域,多线程和单线程是两种不同的执行模式,特别是在Windows操作系统中,`CreateThread`函数被广泛用于创建线程。本篇文章将深入探讨这两种模式的区别,以及如何利用`CreateThread`实现多线程。 首先...

    相机采集、处理、显示多线程处理框架

    这种多线程处理方式可以大大提高相机图像处理的效率和速度,使得相机可以更快地处理和分析图像数据,提高图像处理的精度和准确性。同时,多线程处理还可以避免互相干扰,提高系统的稳定性和实时性。本资源提供一个...

    VC单线程编程实例

    在单线程程序中,所有代码都在同一个线程内运行,而多线程则允许多个任务同时进行。对于初学者来说,理解单线程编程是学习多线程和并发编程的基础。 在VC中,可以使用Windows API函数或者C++标准库中的`&lt;thread&gt;`来...

    java多线程处理数据库数据

    因此,使用多线程可以将任务分解,让每个线程处理一部分数据,从而提高效率。 为了实现这个目标,我们可以使用`ExecutorService`来创建一个线程池。例如,我们可以创建一个固定大小的线程池,这样可以限制同时运行...

Global site tag (gtag.js) - Google Analytics