缘由:
在实际的应用中可能会出现这样一种尴尬:只有一个工作线程(这里叫单线程吧)处理大量的信息。而这些信息由线程池中的执行线程提供而来,起先想用线程同步的机制来实现,但这样子会出现了一些弊端:线程池中的线程会被卡住,直到这个单线程空闲才可以和这些线程池中的线程同步处理,这有违反当初设计这一线程池的目的。
工作内容:
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
.
.
.
.
分享到:
相关推荐
基于Java实现的forkjoin并行任务注解, 用于解决springboot项目下对大量数据单线程处理的性能问题,通过一个注解将任务进行多线程拆分处理,以提高处理性能。 应用场景 比如有一个List类型的集合list,需要需要对...
定时任务+缓存+极光消息推送+多线程处理+单表查询优化等方案,对互联网电商开发性能等要求开发优化
多线程 ...每个线程都有独立的执行路径,因此多线程是多任务处理的一种特殊形式。 多任务处理被所有的现代操作系统所支持。然而,多任务处理有两种截然不同的类型: 基于进程的和基于线程的。
使用线程池管理多线程上传,包含了文件拆分,文件分片多线程上传,单文件上传。多线程执行任务等待管理。拒绝直接new Thread创建新线程导致的诸多问题
用AfxBeginThread()函数来创建一个新线程来执行任务,工作者线程的AfxBeginThread的原型如下: CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID lParam, int nPriority = THREAD_PRIORITY_...
多线程程序是可行的,因为操作系统是多任务的,它有模拟同一-时刻运行多 个应用程序的能力。尽管多数个人计算机只有一一个处理器,但是现在的操作系统 还是通过在多个执行代码片断之间划分处理器时间提供了多任务。...
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程...
并发编程不仅包括多线程,还包括了处理多个独立任务的各种技术和模式,如进程、协程、分布式编程等。并发编程的目标是实现任务的并发执行,以提高系统的性能和资源利用率。 因此,多线程是并发编程的一部分。多线程...
适用于 Android 项目的多线程和多任务下载库。 待办事项清单: 多线程下载。 √ 断点续传支持。 √ 回调接口。 √ 处理异常。 √ 多任务管理。 √ 线程之间的同步通信。 × v1.1.0 有什么新变化? 多任务管理...
多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程...
springboot默认为单线程,多个定时任务时,必须一个执行完后才能执行另外一个,本文通过线程池达到多线程异步处理
理解了单线程就很容易理解多线程了吧,举个例子,假设有语文作文和数学试卷两个任务等你完成,那你肯定只能先完成一个,再完成另一个,这样虽不准确但很明确的理解单线程;往往单线程是很不实用的,太占用时间
09 Java实时多任务调度过程中的安全监控设计 (3) 10 不要重新分配被锁定对象的对象引用 11 以全局的固定顺序获取多个锁来避免死锁 12 Java单例对象同步问题探讨 13 Java 理论与实践: 描绘线程安全性 (2) 14 ...
通常在进行网页爬取时,单线程的爬虫需要逐个请求并解析每个网页,由于网络延迟和IO等待导致相应时间较长。而多线程爬虫可以同时启动多个线程进行并发请求和解析,从而提高爬取效率。 使用多线程爬虫可以将爬取任务...
那多线程是什么呢,就是使用多线程技术来创建多条线程来执行功能,一般情况下,使用多线程的目的是为了多任务的执行,大多数情况下是异步同时执行的,可以相互不影响; 但是,当有多条线程同时操作同一个资源的...
文件如果特别小,而自己网络又非常好的情况下,不建议使用线程池进行下载,因为线程任务的创建也会浪费一些时间和性能!因为写这个程序是为了更快的下载一些4K壁纸,所以传入的url只能是直链,当然 可以根据自己的...
Windows ce作为一个多任务操作系统,采用了一种新的任务调度机制。原理上它将一个进程划分为多个线程,每个线程按照一定的调度策略占用CPU 的运行时间及其资源,这样使得CPU 的调度单元很小,从而提高了CPU 并发处理...
* 在单核单 CPU 的平台上,使用多线程并不能提高任务处理速度。 * 如果线程数量太多,线程调度带来的开销可能会比线程实际执行的开销还大,这样使用多线程就失去了本来的意义。 * 系统运行过程中存在大量的线程,...
例如,基于进程的多任务处理可以在运行Java编译器的同时使用文本编辑器或浏览网站。在基于进程的多任务处理中,程序是调度程序能够调度的最小代码单元。 第6页 Java程序设计案例教程-第8章-多线程编程全文共36页,...