- 浏览: 459910 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
JS操作XMLDOM(遍历和打印) -
lliiqiang:
我这边只要出现图表组件就报告2032号错误。
Flex 出现 Error #2032 是什么意思 -
全保生:
感谢!方法一:(已确认 可行)String username ...
jsp 的url传参中文乱码问题解决办法 -
dy804731771:
谢谢您的分享,对我有帮助
兼容的带样式的INPUT -
huang305585796:
火影头像好屌
FusionCharts统计图导出为图片或pdf
>>//一个简单Thread缓冲池的实现
/*
Queue的一个经典实现是使用一个循环数组(这个实现在很多数据结构的书上都有介绍),如一个大小为size的数组,这个循环数组可以被想象成首尾相连的一个环。oldest指向Queue中最老的数据所在的位置,next指向下一个可以放新数据的位置。
放入一个新数据到next的位置后,需要更新next:next = (next + 1) % size;
从oldest位置取出一个数据后,需要更新oldest:oldest = (oldest + 1) % size;
当oldest == next的时候,Queue为空,
当(next + 1) % size == oldest的时候,Queue为满。
(注意:为了区分Queue为空和为满的情况,实际上Queue里面最多能放size-1个数据。)
因为这个Queue会同时被多个线程访问,需要考虑在这种情况下Queue如何工作。首先,Queue需要是线程安全的,可以用Java里的synchronized关键字来确保同时只有一个Thread在访问Queue.
我们还可以注意到当Queue为空的时候,get操作是无法进行的;当Queue为满的时候,put操作又是无法进行的。在多线程访问遇到这种情况时,一般希望执行操作的线程可以等待(block)直到该操作可以进行下去。比如,但一个Thread在一个空Queue上执行get方法的时候,这个 Thread应当等待(block),直到另外的Thread执行该Queue的put方法后,再继续执行下去。在Java里面,Object对象的 wait(),notify()方法提供了这样的功能。
*/
class SyncQueue {
protected Object[] array;
protected int next;
protected int oldest;
protected int size;
public SyncQueue(int size) {
array = new Object[size];
size = size;
//oldest指向Queue中最老的数据所在的位置,next指向下一个可以放新数据的位置。
oldest = 0; //最后可以取走得线程的索引,就是刚刚取走的线程后边的那个线程。
next = 0; //可以放入新线程的索引。就是刚刚放入的线程的索引的下一位
}
//向线程缓冲池中放入新的线程
//先判断缓冲池是否已经满了,如果满了则等待wait线程执行结束再放入
//涉及到wait和notify方法得都的是在同步synchronized方法里或者同步块里
public synchronized void put(Object o) {
while (full()) {
try {
wait();
} catch (InterruptedException ex) {
throw new ExceptionAdapter(ex);
}
}
//线程池未满,继续放入线程
array[next] = o;
next = (next + 1) % size;//计算下一个可放入线程的位置,对size求余是为了保证不超出数组范围。且可以循环使用。
notify();//clinet放入线程后通知server取出线程去执行
}
//从缓冲池中取出线程 同步synchronized方法
//如果此时线程池为空,则等待放入线程,否则取出线程并通知client放入线程
public synchronized Object get() {
while (empty()) {
try {
wait(); //等待放入线程
} catch (InterruptedException ex) {
throw new ExceptionAdapter(ex);
}
}
Object ret = array[oldest];//获得最有一个线程
oldest = (oldest + 1) % size;//更改下一个可取走线程的位置,对size求余是为了保证不超出数组范围,且可以循环使用。
//server取走线程后 通知client放入线程
notify();
//返回最有一个线程对象去执行
return ret;
}
//判断线程池是否是空的
protected boolean empty() {
//如果下一个可放入线程的位置就是最后一个可取走的线程的位置,则表示线程池是空的
return next == oldest;
}
//判断线程池是否是满得
protected boolean full() {
//如果下一个可放入线程的位置+1对线程池的大小取余等于最后一个可取走的线程得位置,表示线程池是满地。
return (next + 1) % size == oldest;
}
}
/*
next = (next + 1) % size就相当于:(oldest一样,保证不超过数组范围,又可以持续循环)
next ++;
//如果加到最大值,重新从0开始
if(next==size)
{
next =0;
}
*/
/*
Thread缓冲池得原理:定义一个大小为size的Object数组,访队列方式添加和取出数据(先进先出),用next表示可以放入下一个线程的位置(如已经有了1 2 3,则next=4),用oldest表示下一个可以读取线程的位置(如 1234 已经把2取走,则下一个可以取走的oldest=3),client每放入一个新的线程之前,判断缓冲池是否已经满了,满了就等待(wait)
server取走线程执行,否则放入线程,并修改可以放入下一个线程的位置 (方法是next =(next+1)%size 对size求余保证不超过数组范围,又可以持续循环),然后通知(notify)server取走线程对象。
server每次读取一个线程之前, 先判断线程池是否是空的,空的就等待(wait)client放入线程,否则取走最先放入的那个线程(例如数组1 2 3 4,读取oldest=1的线程对象,此时可放入next=5 ), 然后修改可读取线程对象的位置(方法是oldest =(oldest+1)%size 对size求余保证不超过数组范围,又可以持续循环),最后通知(notify)client继续放入线程*/
2>>多线程编程
随着计算机技术的发展,编程模型也越来越复杂多样化。但多线程编程模型是目前计算机系统架构的最终模型。随着CPU主频的不断攀升,X86架构的硬件已经成为瓶,在这种架构的CPU主频最高为4G。事实上目前3.6G主频的CPU已经接近了顶峰。 如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能),那么继续提高CPU性能的方法就是超线程CPU模式。那么,作业系统、应用程序要发挥CPU的最大性能,就是要改变到以多线程编程模型为主的并行处理系统和并发式应用程序。
所以,掌握多线程编程模型,不仅是目前提高应用性能的手段,更是下一代编程模型的核心思想。多线程编程的目的,就是"最大限度地利用CPU资源",当某一线程的处理不需要占用CPU而只和I/O,OEMBIOS等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。从根本上说,这就是多线程编程的最终目的。
2>>线程对象和线程的区别: 线程对象是可以产生线程的对象。比如在java平台中Thread对象,Runnable对象。
线程,是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。在JAVA中,线程对象是JVM产生的一个普通的Object子类。而线程是CPU分配给这个对象的一个运行过程。我们说"个线程在干什么",不说"一个线程对象在干什么"
3>>JVM;Java Virtual Machine(Java虚拟机)。运行main方法:JVM进程被启动,在同一个JVM进程中,有且只有一个进程,就是它自己。然后在这个JVM环境中,所有程序的运行都是以线程来运行。JVM最先会产生一个主线程,由它来运行指定程序的入口点。在这个程序中,就是主线程从main方法开始运行。当main方法结束后,主线程运行完成。JVM进程也随之退出。(每个程序只有一个main方法,所以它只对应一个进程,但对应多个线程)
>>4多线程Java 应用程序构建(Concurrent Programming)
1 JSR-166(Java concurrency utilities),是Java5.0的一部分,通过着重在宽度并提供跨域大范围并发编程风格的重要功能,大大简化了在Java中并发应用程序的开发。
注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。(和线程的时间片有关系).
>>随机数休眠进程:Thread.sleep((int) Math.random() * 10);
>>同步方法和方法调用的区别:
public synchronized void m1(){a =1000;}
public synchronized void m2() { a =5000;}
public void m3() { a =5000;}
当m1执行时,m2无法进行,m3可以,因为m2的进行要对a进行加锁,但此时m1已经将a加锁,所以m2无法进行。而m3的进行无需对m3进行加锁,所以m3可以正常的进行。也就是说:不是同步的方法可以访问正在同步的方法的变量资源
>>加锁的变量的使用机制(自己理解)
加锁的同步方法或者同步块,对方法体内的变量资源独占,当其他的方法访问变量时,需要等待该方法对变量资源解锁,也就是该方法结束,也就是方法运行到"}"(与数据库的修改操作需要同步,查询操作不用同步)
>>同步方法的执行过程特点
public synchronized void m2()
{
语句1;
语句2;
语句3;
语句4;
。。。
}
执行时,语句1 2 3 4不允许被别的线程打断,即执行完1就走2,然后就走3,紧接著4
网上资源:
http://www.enet.com.cn/eschool/zhuanti/java/ (孙鑫)
http://v.youku.com/v_show/id_XNTMzMTY4MTI=.html (尚学堂)
/*
Queue的一个经典实现是使用一个循环数组(这个实现在很多数据结构的书上都有介绍),如一个大小为size的数组,这个循环数组可以被想象成首尾相连的一个环。oldest指向Queue中最老的数据所在的位置,next指向下一个可以放新数据的位置。
放入一个新数据到next的位置后,需要更新next:next = (next + 1) % size;
从oldest位置取出一个数据后,需要更新oldest:oldest = (oldest + 1) % size;
当oldest == next的时候,Queue为空,
当(next + 1) % size == oldest的时候,Queue为满。
(注意:为了区分Queue为空和为满的情况,实际上Queue里面最多能放size-1个数据。)
因为这个Queue会同时被多个线程访问,需要考虑在这种情况下Queue如何工作。首先,Queue需要是线程安全的,可以用Java里的synchronized关键字来确保同时只有一个Thread在访问Queue.
我们还可以注意到当Queue为空的时候,get操作是无法进行的;当Queue为满的时候,put操作又是无法进行的。在多线程访问遇到这种情况时,一般希望执行操作的线程可以等待(block)直到该操作可以进行下去。比如,但一个Thread在一个空Queue上执行get方法的时候,这个 Thread应当等待(block),直到另外的Thread执行该Queue的put方法后,再继续执行下去。在Java里面,Object对象的 wait(),notify()方法提供了这样的功能。
*/
class SyncQueue {
protected Object[] array;
protected int next;
protected int oldest;
protected int size;
public SyncQueue(int size) {
array = new Object[size];
size = size;
//oldest指向Queue中最老的数据所在的位置,next指向下一个可以放新数据的位置。
oldest = 0; //最后可以取走得线程的索引,就是刚刚取走的线程后边的那个线程。
next = 0; //可以放入新线程的索引。就是刚刚放入的线程的索引的下一位
}
//向线程缓冲池中放入新的线程
//先判断缓冲池是否已经满了,如果满了则等待wait线程执行结束再放入
//涉及到wait和notify方法得都的是在同步synchronized方法里或者同步块里
public synchronized void put(Object o) {
while (full()) {
try {
wait();
} catch (InterruptedException ex) {
throw new ExceptionAdapter(ex);
}
}
//线程池未满,继续放入线程
array[next] = o;
next = (next + 1) % size;//计算下一个可放入线程的位置,对size求余是为了保证不超出数组范围。且可以循环使用。
notify();//clinet放入线程后通知server取出线程去执行
}
//从缓冲池中取出线程 同步synchronized方法
//如果此时线程池为空,则等待放入线程,否则取出线程并通知client放入线程
public synchronized Object get() {
while (empty()) {
try {
wait(); //等待放入线程
} catch (InterruptedException ex) {
throw new ExceptionAdapter(ex);
}
}
Object ret = array[oldest];//获得最有一个线程
oldest = (oldest + 1) % size;//更改下一个可取走线程的位置,对size求余是为了保证不超出数组范围,且可以循环使用。
//server取走线程后 通知client放入线程
notify();
//返回最有一个线程对象去执行
return ret;
}
//判断线程池是否是空的
protected boolean empty() {
//如果下一个可放入线程的位置就是最后一个可取走的线程的位置,则表示线程池是空的
return next == oldest;
}
//判断线程池是否是满得
protected boolean full() {
//如果下一个可放入线程的位置+1对线程池的大小取余等于最后一个可取走的线程得位置,表示线程池是满地。
return (next + 1) % size == oldest;
}
}
/*
next = (next + 1) % size就相当于:(oldest一样,保证不超过数组范围,又可以持续循环)
next ++;
//如果加到最大值,重新从0开始
if(next==size)
{
next =0;
}
*/
/*
Thread缓冲池得原理:定义一个大小为size的Object数组,访队列方式添加和取出数据(先进先出),用next表示可以放入下一个线程的位置(如已经有了1 2 3,则next=4),用oldest表示下一个可以读取线程的位置(如 1234 已经把2取走,则下一个可以取走的oldest=3),client每放入一个新的线程之前,判断缓冲池是否已经满了,满了就等待(wait)
server取走线程执行,否则放入线程,并修改可以放入下一个线程的位置 (方法是next =(next+1)%size 对size求余保证不超过数组范围,又可以持续循环),然后通知(notify)server取走线程对象。
server每次读取一个线程之前, 先判断线程池是否是空的,空的就等待(wait)client放入线程,否则取走最先放入的那个线程(例如数组1 2 3 4,读取oldest=1的线程对象,此时可放入next=5 ), 然后修改可读取线程对象的位置(方法是oldest =(oldest+1)%size 对size求余保证不超过数组范围,又可以持续循环),最后通知(notify)client继续放入线程*/
2>>多线程编程
随着计算机技术的发展,编程模型也越来越复杂多样化。但多线程编程模型是目前计算机系统架构的最终模型。随着CPU主频的不断攀升,X86架构的硬件已经成为瓶,在这种架构的CPU主频最高为4G。事实上目前3.6G主频的CPU已经接近了顶峰。 如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能),那么继续提高CPU性能的方法就是超线程CPU模式。那么,作业系统、应用程序要发挥CPU的最大性能,就是要改变到以多线程编程模型为主的并行处理系统和并发式应用程序。
所以,掌握多线程编程模型,不仅是目前提高应用性能的手段,更是下一代编程模型的核心思想。多线程编程的目的,就是"最大限度地利用CPU资源",当某一线程的处理不需要占用CPU而只和I/O,OEMBIOS等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。从根本上说,这就是多线程编程的最终目的。
2>>线程对象和线程的区别: 线程对象是可以产生线程的对象。比如在java平台中Thread对象,Runnable对象。
线程,是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。在JAVA中,线程对象是JVM产生的一个普通的Object子类。而线程是CPU分配给这个对象的一个运行过程。我们说"个线程在干什么",不说"一个线程对象在干什么"
3>>JVM;Java Virtual Machine(Java虚拟机)。运行main方法:JVM进程被启动,在同一个JVM进程中,有且只有一个进程,就是它自己。然后在这个JVM环境中,所有程序的运行都是以线程来运行。JVM最先会产生一个主线程,由它来运行指定程序的入口点。在这个程序中,就是主线程从main方法开始运行。当main方法结束后,主线程运行完成。JVM进程也随之退出。(每个程序只有一个main方法,所以它只对应一个进程,但对应多个线程)
>>4多线程Java 应用程序构建(Concurrent Programming)
1 JSR-166(Java concurrency utilities),是Java5.0的一部分,通过着重在宽度并提供跨域大范围并发编程风格的重要功能,大大简化了在Java中并发应用程序的开发。
注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。(和线程的时间片有关系).
>>随机数休眠进程:Thread.sleep((int) Math.random() * 10);
>>同步方法和方法调用的区别:
public synchronized void m1(){a =1000;}
public synchronized void m2() { a =5000;}
public void m3() { a =5000;}
当m1执行时,m2无法进行,m3可以,因为m2的进行要对a进行加锁,但此时m1已经将a加锁,所以m2无法进行。而m3的进行无需对m3进行加锁,所以m3可以正常的进行。也就是说:不是同步的方法可以访问正在同步的方法的变量资源
>>加锁的变量的使用机制(自己理解)
加锁的同步方法或者同步块,对方法体内的变量资源独占,当其他的方法访问变量时,需要等待该方法对变量资源解锁,也就是该方法结束,也就是方法运行到"}"(与数据库的修改操作需要同步,查询操作不用同步)
>>同步方法的执行过程特点
public synchronized void m2()
{
语句1;
语句2;
语句3;
语句4;
。。。
}
执行时,语句1 2 3 4不允许被别的线程打断,即执行完1就走2,然后就走3,紧接著4
网上资源:
http://www.enet.com.cn/eschool/zhuanti/java/ (孙鑫)
http://v.youku.com/v_show/id_XNTMzMTY4MTI=.html (尚学堂)
发表评论
-
【Blue-Bird】邮件群发系统
2013-03-25 21:46 1194【Blue-Bird】邮件发送系统,是我研发的一个Java ... -
java获取本地磁盘(过滤掉U盘和软盘等)
2012-10-16 09:40 4030File[] _files = File.listRoo ... -
XmlDOM 小结
2012-08-10 16:53 1067/* 获取节点: - xmlDoc.getElem ... -
eclipse内存溢出处理办法
2012-07-31 14:44 3828"java.lang.OutOfMemoryErr ... -
tomcat使用xml文件部署项目
2012-02-02 21:53 1263<Context path="/emss ... -
String.format
2011-12-02 23:09 1048String[] arr =new String[2]; ... -
配置一个最简洁的DWR
2011-04-04 16:31 1038期工作: 1.dwr官网下载dwr.jar(http://d ... -
通过xml文件在tomcat中部署项目&取消保存session.ser的配置
2011-03-29 10:34 1780<Context path="/anjian& ... -
plsql操作oracle数据库小结
2011-03-28 18:05 5682登录oracle D:\>sqlplus ... -
java编程思想读书笔记
2011-03-17 11:06 11141 用句柄操作对象:句柄也叫引用或者指针。 可将这一情 ... -
CVSNT 用户单一验证方式建设文档
2011-03-01 10:29 14151 配置cvs服务 CVSNT Control Panel ... -
EasyT.java(20110223版本)
2011-02-23 14:56 1561package org.hdht.util; impor ... -
java杂谈
2011-02-23 14:47 1160hibenate配置文件定义datas ... -
Spring下的BaseHibernateDAO
2011-02-23 14:46 3590package com.accp.myzf.hibernate ... -
带事务得spring配置文件
2011-02-23 14:44 1186<?xml version="1.0" ... -
单利模式,堆栈,队列
2011-02-23 14:43 1102单利实例-------------- using Syste ... -
线程3
2011-02-23 14:41 1075配置java环境变量: 1指定jdk的bin目录路径:pat ... -
线程2
2011-02-23 14:39 1073>>3内部class类继承Thread的线程实现方 ... -
基于TCP的Socket编程
2011-02-23 14:35 1170>>Socket相关的理解: 1>TCP:拨 ... -
基于UDP的Socket编程
2011-02-23 14:33 17341>>基于UDP的Socket编程用到的类和方法 ...
相关推荐
thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread ...
《RT-Thread常见函数》是针对RT-Thread实时操作系统中常用函数的一份详细参考资料,旨在帮助开发者更好地理解和应用RTT的API。RT-Thread(简称RTT)是一款成熟、稳定且功能丰富的开源实时操作系统,广泛应用于物联网...
RT Thread是一款轻量级、高性能、组件丰富的实时操作系统(RTOS),尤其适合于嵌入式系统。这个压缩包中包含的“5,RT Thread操作系统教程及资料(第三方合作伙伴)”很可能是由RT Thread社区或者合作伙伴提供的学习...
RT-Thread是一个开源的实时操作系统(RTOS),专为嵌入式系统设计,具有高可靠性、低功耗和轻量级的特点。"rt-thread-3.1.3" 是该操作系统的特定版本,代表着该版本在功能和性能上的优化与改进。 RT-Thread Nano是...
RTThreadSTM32标准库参考工程是一个专门为基于STM32微控制器的实时操作系统(RTOS)RT-Thread设计的示例项目。RT-Thread是一个开源、轻量级且功能强大的RTOS,广泛应用于物联网(IoT)设备和嵌入式系统。这个压缩包...
`Thread`类是.NET框架提供的用于创建和管理线程的核心类。其中,`Thread.IsAlive`属性是一个非常重要的成员,它允许开发者检查线程的当前状态,以确定线程是否已经启动并且仍在运行。在理解`Thread.IsAlive`属性的...
RT-Thread是一款由中国开源社区贡献的物联网操作系统,它具备极强的可伸缩性。可伸缩性体现在其核心可以在最小的ARMCortex-M0微控制器上运行,到中等规模的ARMCortex-M3/M4/M7系统,以及更高性能的MIPS32和ARMCortex...
### ThreadX概述与嵌入式实时系统 #### 一、ThreadX简介 ThreadX是一款由ExpressLogic公司开发的高性能实时操作系统(RTOS),主要用于嵌入式系统开发领域。该操作系统以其出色的稳定性和实时性著称,并且具备较高的...
### ThreadX中文学习手册知识点概览 #### 一、ThreadX概述 - **定义与特点**:ThreadX是由Express Logic公司开发的一款高性能实时操作系统(RTOS)内核,专门针对嵌入式应用设计。与传统的RTOS相比,ThreadX具有更...
### ThreadX实时操作系统知识点 #### 一、ThreadX概述 - **定义与特点**:ThreadX是一款由ExpressLogic公司开发的高性能实时操作系统内核。它以其高性能、通用性及强大的可移植性著称,适用于各种嵌入式系统,尤其...
RT-Thread 入门教程 PPT RT-Thread 是一款国产的嵌入式操作系统,诞生于 2006 年,经过十多年的积淀,已经成为一款知名度较高、口碑极佳、高度稳定可靠的实时操作系统。RT-Thread 作为一款中间件平台,具有极强的...
STM32可以有STM32CubeMX轻松移植THreadX,雅特力从AT43F435/437系列开始不能完全兼容STM32,用不了THreadX了。 本移植采用最新(截至2023年3月12号)的AT32F435/437固件库V2.1.2,THreadX版本V6.2.1;依照雅特力官方...
ThreadX是一款广泛应用于嵌入式系统的实时操作系统(RTOS),它为开发者提供了高效、可靠的多线程环境,以实现复杂的实时任务调度。ThreadX的核心特性包括轻量级内核、优先级继承、时间片轮转、内存管理以及中断处理...
ThreadX是一款嵌入式实时操作系统(RTOS),由Express Logic公司开发。这个"ThreadX5.1 Win32 Demo"是2009年的最新版本,它提供了在Win32平台上运行ThreadX操作系统的演示环境。了解ThreadX对于深入学习嵌入式系统...
实时操作系统(RTOS)ThreadX剖析 实时操作系统ThreadX是一种专门为嵌入式系统设计的操作系统,它能够满足实时性要求较高的任务调度和管理需求。在嵌入式系统的领域中,实时性是系统能否及时响应外部事件并进行处理...
RT-Thread是一款由国内团队开发并维护的嵌入式实时操作系统,拥有完全的自主知识产权。自成立以来,RT-Thread经过长时间的发展,已经成为了一个功能强大、组件丰富的物联网操作系统,尤其适应于资源受限的微控制器...
RT-Thread是一个流行的开源实时操作系统,广泛应用于嵌入式系统和物联网领域。它具有高度模块化、可裁剪的内核设计,适合资源有限的微控制器使用。以下是根据提供的文件信息,详细的RT-Thread编程指南相关知识点: ...
### ThreadX在ARM9上的移植指导 #### 一、ThreadX简介与工作原理 ThreadX是一款由Express Logic公司开发的实时操作系统(RTOS),以其高效、可靠及轻量级等特点著称,广泛应用于嵌入式系统领域。ThreadX采用抢占式...
RT-Thread常见问题解答 本文将对RT-Thread操作系统开发中常见的问题进行解答,涵盖了线程控制、日志输出、线程删除、静态和动态线程定义等方面。 一、线程控制问题 1. 创建线程后,使用list_thread()显示线程的...
RT-Thread是一款面向嵌入式设备的开源实时微操作系统(RTOS),其具备高度的模块化和可配置性,非常适合资源受限的单片机平台。作为一款轻量级操作系统,RT-Thread提供了完整的实时操作系统所需的功能,包括线程管理...