并
发库中的BlockingQueue
是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。
下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中,
另外四个写线程用于取出文件对象,为了模拟写操作耗时长的特点,特让线程睡眠一段随机长度的时间。另外,该Demo也使用到了线程池和原子整型
(AtomicInteger),AtomicInteger可以在并发情况下达到原子化更新,避免使用了synchronized,而且性能非常高。由
于阻塞队列的put和take操作会阻塞,为了使线程退出,特在队列中添加了一个“标识”,算法中也叫“哨兵”,当发现这个哨兵后,写线程就退出。
当然线程池也要显式退出了。
package
concurrent;
import
java.io.File;
import
java.io.FileFilter;
import
java.util.concurrent.BlockingQueue;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.LinkedBlockingQueue;
import
java.util.concurrent.atomic.AtomicInteger;
public class
TestBlockingQueue
{
static
long
randomTime
() {
return
(
long
) (
Math.random
()
*
1000
)
;
}
public static
void
main
(
String
[]
args
) {
// 能容纳100个文件
final
BlockingQueue<File> queue =
new
LinkedBlockingQueue<File>
(
100
)
;
// 线程池
final
ExecutorService exec = Executors.newFixedThreadPool
(
5
)
;
final
File root =
new
File
(
"F:\\JavaLib"
)
;
// 完成标志
final
File exitFile =
new
File
(
""
)
;
// 读个数
final
AtomicInteger rc =
new
AtomicInteger
()
;
// 写个数
final
AtomicInteger wc =
new
AtomicInteger
()
;
// 读线程
Runnable read =
new
Runnable
() {
public
void
run
() {
scanFile
(
root
)
;
scanFile
(
exitFile
)
;
}
public
void
scanFile
(
File file
) {
if
(
file.isDirectory
()) {
File
[]
files = file.listFiles
(
new
FileFilter
() {
public
boolean
accept
(
File pathname
) {
return
pathname.isDirectory
()
|| pathname.getPath
()
.endsWith
(
".java"
)
;
}
})
;
for
(
File one : files
)
scanFile
(
one
)
;
}
else
{
try
{
int
index = rc.incrementAndGet
()
;
System.out.println
(
"Read0: "
+ index +
" "
+ file.getPath
())
;
queue.put
(
file
)
;
}
catch
(
InterruptedException e
) {
}
}
}
}
;
exec.submit
(
read
)
;
// 四个写线程
for
(
int
index =
0
; index <
4
; index++
) {
// write thread
final
int
NO = index;
Runnable write =
new
Runnable
() {
String threadName =
"Write"
+ NO;
public
void
run
() {
while
(
true
) {
try
{
Thread.sleep
(
randomTime
())
;
int
index = wc.incrementAndGet
()
;
File file = queue.take
()
;
// 队列已经无对象
if
(
file == exitFile
) {
// 再次添加"标志",以让其他线程正常退出
queue.put
(
exitFile
)
;
break
;
}
System.out.println
(
threadName +
": "
+ index +
" "
+ file.getPath
())
;
}
catch
(
InterruptedException e
) {
}
}
}
}
;
exec.submit
(
write
)
;
}
exec.shutdown
()
;
}
}
分享到:
相关推荐
jdk-8u202-linux-arm64-vfp-hflt.tar.gz适用于Linux ARM v6/v7 Soft Float ABI 64位系统,是在Binary Code License (“BCL”)许可协议下提供最后的免费商业版本,允许用在生产环境中; 对于 2019 年 4 月 16 日开始...
jdk 17需要 新增 配置 如下 jvm参数 --add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED --add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--》util.concurrent(java.util part3)
jdk-8u241-linux-arm64-vfp-hflt.tar.gz 64位的ArmLinux系统java jdk
64位的jdk安装文件,Java-version-1.8.0_45版本,可以直接下载。
java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...
Centos7离线安装文件 jdk-8u231-linux-x64.tar.gz压缩包 免费下载,现在博客都是付费文件,搞得头大,现在免费分享
jdk-8u111-linux-arm64-vfp-hflt.tar.gz
1.下载后重命名:jdk-8u281-linux-x64.tar.gz 2.解压 tar -zxvf jdk-8u281-linux-x64.tar.gz 3.配置环境变量:vim /etc/profile 最后添加: export JAVA_HOME=/opt/jdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$...
标签:bouncycastle、bcmail、jdk14、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译...
jdk-8u151-linux-arm64-vfp-hflt.tar.gz.................................................................................................
jdk-8u202-linux-arm64-vfp-hflt.tar.gz,Oracle-jdk8,JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和...
最新版linux jdk-8u371-linux-x64.tar.zip最新版linux jdk-8u371-linux-x64.tar.zip最新版linux jdk-8u371-linux-x64.tar.zip
常用Linux服务器环境的JDK jdk-8u121-linux-x64.tar.gz文件在Linux_JDK8内,请解压之后使用,如果无法下载请留言!
jdk-8u231-linux-x64.tar.gz JDK for linux x64 tar.gz 大小:185.16 MB sha256: a011584a2c9378bf70c6903ef5fbf101b30b08937441dc2ec67932fb3620b2cf md5: c1fef2e714be761773ee0fc2be5dd78e
arm架构的1.7jdk,在树莓派4B上可以应用<jdk-7u51-linux-arm-vfp-hflt.gz>
压缩包内容: Java SE Development Kit 8u301 (1)jdk-8u301-linux-aarch64.rpm ...(4)jdk-8u301-linux-i586.rpm (5)jdk-8u301-linux-i586.tar.gz (6)jdk-8u301-linux-x64.rpm (7)jdk-8u301-linux-x64.tar.gz
官方 jdk1.8 jdk-8u213-linux-arm64-vfp-hflt.tar.zip
Linux下arm_64平台jdk安装包,oracle版本的源码包,包含jre。有需要的小伙伴下载吧。