`
joknm
  • 浏览: 61931 次
  • 性别: 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实现的forkjoin并行任务注解工具, 用于springboot项目下对大量数据单线程处理的性能问题

    基于Java实现的forkjoin并行任务注解, 用于解决springboot项目下对大量数据单线程处理的性能问题,通过一个注解将任务进行多线程拆分处理,以提高处理性能。 应用场景 比如有一个List类型的集合list,需要需要对...

    定时任务+缓存+极光消息推送+多线程处理+单表查询优化

    定时任务+缓存+极光消息推送+多线程处理+单表查询优化等方案,对互联网电商开发性能等要求开发优化

    多线程面试相关知识点

    多线程 ...每个线程都有独立的执行路径,因此多线程是多任务处理的一种特殊形式。 多任务处理被所有的现代操作系统所支持。然而,多任务处理有两种截然不同的类型: 基于进程的和基于线程的。

    线程池管理多线程上传

    使用线程池管理多线程上传,包含了文件拆分,文件分片多线程上传,单文件上传。多线程执行任务等待管理。拒绝直接new Thread创建新线程导致的诸多问题

    CreateThread创建多线程与单线程比较

    用AfxBeginThread()函数来创建一个新线程来执行任务,工作者线程的AfxBeginThread的原型如下: CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,  LPVOID lParam,  int nPriority = THREAD_PRIORITY_...

    VB.net多线程编程.pdf

    多线程程序是可行的,因为操作系统是多任务的,它有模拟同一-时刻运行多 个应用程序的能力。尽管多数个人计算机只有一一个处理器,但是现在的操作系统 还是通过在多个执行代码片断之间划分处理器时间提供了多任务。...

    VC 多线程编程

    多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程...

    Java并发编程和多线程的区别

    并发编程不仅包括多线程,还包括了处理多个独立任务的各种技术和模式,如进程、协程、分布式编程等。并发编程的目标是实现任务的并发执行,以提高系统的性能和资源利用率。 因此,多线程是并发编程的一部分。多线程...

    ReinaDownloader:Android项目的多线程多任务下载库

    适用于 Android 项目的多线程和多任务下载库。 待办事项清单: 多线程下载。 √ 断点续传支持。 √ 回调接口。 √ 处理异常。 √ 多任务管理。 √ 线程之间的同步通信。 × v1.1.0 有什么新变化? 多任务管理...

    VC 多线程编程.docx

    多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程...

    spring boot 多线程.docx

    springboot默认为单线程,多个定时任务时,必须一个执行完后才能执行另外一个,本文通过线程池达到多线程异步处理

    【arduino多线程编程】arduino竟然还能多线程编程?确定不进来夸一下嘛……

      理解了单线程就很容易理解多线程了吧,举个例子,假设有语文作文和数学试卷两个任务等你完成,那你肯定只能先完成一个,再完成另一个,这样虽不准确但很明确的理解单线程;往往单线程是很不实用的,太占用时间

    concurrent 多线程 教材

    09 Java实时多任务调度过程中的安全监控设计 (3) 10 不要重新分配被锁定对象的对象引用 11 以全局的固定顺序获取多个锁来避免死锁 12 Java单例对象同步问题探讨 13 Java 理论与实践: 描绘线程安全性 (2) 14 ...

    Python编写的开源、多线程的网站爬虫

    通常在进行网页爬取时,单线程的爬虫需要逐个请求并解析每个网页,由于网络延迟和IO等待导致相应时间较长。而多线程爬虫可以同时启动多个线程进行并发请求和解析,从而提高爬取效率。 使用多线程爬虫可以将爬取任务...

    C++ Qt创建多线程的2种方式:重写run函数,使用moveToThread【应该早点知道的】源码示例

     那多线程是什么呢,就是使用多线程技术来创建多条线程来执行功能,一般情况下,使用多线程的目的是为了多任务的执行,大多数情况下是异步同时执行的,可以相互不影响;  但是,当有多条线程同时操作同一个资源的...

    Java 利用多线程实现文件的分片下载

    文件如果特别小,而自己网络又非常好的情况下,不建议使用线程池进行下载,因为线程任务的创建也会浪费一些时间和性能!因为写这个程序是为了更快的下载一些4K壁纸,所以传入的url只能是直链,当然 可以根据自己的...

    嵌入式WinCE多线程编程研究与实现

    Windows ce作为一个多任务操作系统,采用了一种新的任务调度机制。原理上它将一个进程划分为多个线程,每个线程按照一定的调度策略占用CPU 的运行时间及其资源,这样使得CPU 的调度单元很小,从而提高了CPU 并发处理...

    第13章 多线程与多进程编程.pptx

    * 在单核单 CPU 的平台上,使用多线程并不能提高任务处理速度。 * 如果线程数量太多,线程调度带来的开销可能会比线程实际执行的开销还大,这样使用多线程就失去了本来的意义。 * 系统运行过程中存在大量的线程,...

    Java程序设计案例教程-第8章-多线程编程.pptx

    例如,基于进程的多任务处理可以在运行Java编译器的同时使用文本编辑器或浏览网站。在基于进程的多任务处理中,程序是调度程序能够调度的最小代码单元。 第6页 Java程序设计案例教程-第8章-多线程编程全文共36页,...

Global site tag (gtag.js) - Google Analytics