长期以来,我都觉得多线程的使用是重要而又较难掌握的,要用的时候现看,下次用的时候忘记了,又要现看,这可能跟我长期从事的是Application Server中,某种固定架构下的编程,平时并不太需要自己管理线程这一事实有比较大的关系。过年的时候,因为着手策划自己的一个应用程序架构,对线程的问题多看了几眼。

在我看来Java api对线程的封装似乎过于简洁,或者说过于基础,太多事情要自己处理。这与Java api其他某些包事无巨细的包办形成鲜明的对比,每当我使用到线程这一部分,就觉得倒退到了锤子敲铁皮的时代。当然这增加了灵活性,但确实也增加了使用多线程开发并发程序的门槛。

Java api中的三大板斧:synchronized/wait/notify,的确简单有效。但是在某些情况下,需要更加复杂更加高层次的同步工具。找到了Doug Lea 编写的一个优秀的并发实用程序开放源码库 util.concurrent,它包括互斥、信号量、适于并发的集合类以及几个工作队列实现。

util.concurrent 库已经用于 Java? SDK 1.5 。

有了这个包,多线程特性可以更方便的使用了。我认为,如果这个包实现的足够好(bug少少,性能高高),将会为我们的编程带来非常大的方便。加入了这个包,java api 的抽象层次,在各个包之间,才算达到平衡的状态。

下面来看看这个包里面具体有些什么样的好东西。

sync接口:专门负责同步操作,用于替代Java提供的synchronized关键字,以实现更加灵活的代码同步。实现这个接口的类有下面几个。

Semaphore:信号量。和synchronized类似,提供了acquire()方法允许在设定时间内尝试锁定信号量,若超时则返回false。

Mutex:和synchronized类似,与之不同的是,synchronized的同步段只能限制在一个方法内,而Mutex对象可以作为参数在方法间传递,所以可以把同步代码范围扩大到跨方法甚至跨对象。

NullSync:一个比较奇怪的东西,其方法的内部实现都是空的,可能是作者认为如果你在实际中发现某段代码根本可以不用同步,但是又不想过多改动这段代码,那么就可以用NullSync来替代原来的Sync实例。此外,由于NullSync的方法都是synchronized,所以还是保留了“内存壁垒”的特性。

ObservableSync:把sync和observer模式结合起来,当sync的方法被调用时,把消息通知给订阅者,可用于同步性能调试。

TimeoutSync:可以包在Sync的外层,实现上锁超时控制的类,具体上锁的代码靠构造函数传入的sync实例来完成,其自身只负责监测上锁操作是否超时,可与SyncSet合用。

Channel接口:代表一种具备同步控制能力的容器,你可以从中存放/读取对象。不同于api中的Collection接口,可以把Channel看作是连接对象生产者(Producer)和对象消费者(Consumer)之间的一根管道。通过和Sync接口配合,Channel提供了阻塞式的对象存取方法(put/take)以及可设置阻塞等待时间的offer/poll方法。实现Channel接口的类有LinkedQueue,BoundedLinkedQueue,BoundedBuffer,BoundedPriorityQueue,SynchronousChannel,Slot等。

使用Channel我们可以很容易的编写具备消息队列功能的代码,示例如下:

Package org.javaresearch.j2seimproved.thread;

Import EDU.oswego.cs.dl.util.concurrent.*;

public class TestChannel {

final Channel msgQ = new LinkedQueue(); //log信息队列

public static void main(String[] args) {

TestChannel tc = new TestChannel();

For(int i = 0;i < 10;i ++){

Try{

tc.serve();

Thread.sleep(1000);

}catch(InterruptedException ie){

}

}

}

public void serve() throws InterruptedException {

String status = doService();

//把doService()返回状态放入Channel,后台logger线程自动读取之

msgQ.put(status);

}

private String doService() {

// Do service here

return "service completed OK! ";

}

public TestChannel() { // start background thread

Runnable logger = new Runnable() {

public void run() {

try {

for (; ; )

System.out.println("Logger: " + msgQ.take());

}

catch (InterruptedException ie) {}

}

};

new Thread(logger).start();

}

}

Excutor/ThreadFactory接口: 把相关的线程创建/回收/维护/调度等工作封装起来,而让调用者只专心于具体任务的编码工作(即实现Runnable接口),不必显式创建Thread类实例就能异步执行任务。

同时,Excutor的某些实现类实现了线程的“轻量级”使用,包括线程池,任务队列等。具体的实现有: PooledExecutor,ThreadedExecutor,QueuedExecutor,FJTaskRunnerGroup等。

下面给出一段代码,使用PooledExecutor实现一个简单的多线程服务器。

package org.javaresearch.j2seimproved.thread;

import java.net.*;

import EDU.oswego.cs.dl.util.concurrent.*;

public class TestExecutor {

public static void main(String[] args) {

PooledExecutor pool =

new PooledExecutor(new BoundedBuffer(10), 20);

pool.createThreads(4);

try {

ServerSocket socket = new ServerSocket(9999);

for (; ; ) {

final Socket connection = socket.accept();

pool.execute(new Runnable() {

public void run() {

new Handler().process(connection);

}

});

}

}

catch (Exception e) {} // die

}

static class Handler {

void process(Socket s){

}

}

}

java鼠标指针锤子,java线程工具走出锤子敲铁皮时代。相关推荐

  1. java鼠标指针锤子,如果用4个技能打不过他,那就用7个

    本篇攻略重制于[2020.3.25]对应版本[10.06] 内容/整理[冬雨] 封面[南烛子] 全文约2412字,阅读需7分钟 今天要给大家讲解的英雄是未来守护者杰斯.杰斯集消耗与爆发于一体,同时具备 ...

  2. java鼠标指针锤子,写个锤子JS!它应该是你最后的选择

    本文翻译自: https://dev.to/olpeh/javascript-should-be-your-last-resort-5dje 在进行现代化Web前端开发时,使用着自己最爱的框架,有时候 ...

  3. java鼠标指针锤子_深入剖析锤子onestep代码实现 - 上篇

    OneStep的四大功能 自身设置 设置(添删图标,图标排序),onestep模式进入.退出 应用切换 启动.切换应用,包括联系人图标,直达联系人对话页面 拖拽分享 拖拽图片.文字到侧边栏图标,然后分 ...

  4. java 鼠标停留时,[Java教程]鼠标悬浮停留三秒 显示大图_星空网

    鼠标悬浮停留三秒 显示大图 2014-06-27 0 网站大连烟花网 http://dlyh365.com *{margin:0;padding:0;list-style-type:none;} im ...

  5. 小程序开发者工具模拟器鼠标无法显示 鼠标指针在微信开发工具中不显示

    1.问题:鼠标划在模拟器上就是不显示鼠标 但是能点 解决方法:

  6. [WPF]自定义鼠标指针

    [WPF]自定义鼠标指针 原文:[WPF]自定义鼠标指针 [WPF]自定义鼠标指针 周银辉 看看WPF Cursor类的两个构造函数吧: public Cursor(Stream cursorStre ...

  7. swing jtable显示html,Java Swing:基于鼠标指针下的文本显示JTable中的工具提示

    我有一个JTable,其中显示一些使用html格式化的字符串数据.我需要显示鼠标指针Java Swing:基于鼠标指针下的文本显示JTable中的工具提示 在鼠标移到"线路1"和& ...

  8. java获取鼠标在屏幕中的位置 方法一_Java如何获取鼠标指针的位置?

    MouseInfo 提供获取有关鼠标信息的方法,例如鼠标指针的位置和鼠标按钮的数量.package org.nhooo.example.awt; import java.awt.*; public c ...

  9. 【Java AWT 图形界面编程】使用鼠标滚轮缩放 Canvas 画布中绘制的背景图像 ( 绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放 + 以当前鼠标指针位置为缩放中心 示例 )

    文章目录 一.鼠标滚轮缩放的中心点设置为当前鼠标中心点 - 要点分析 1.保存当前鼠标指针指向的位置 2.根据鼠标指针指向的位置以及比例重新计算图片位置 二.绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩 ...

最新文章

  1. Face Model Compression by Distilling Knowledge from Neurons 论文理解
  2. 魔幻的“净醛产品”:宜家被罚“亡羊”,欧派用视频“补牢”?
  3. 用Go开发支持百万级数据量的高性能缓存服务
  4. 滴滴 KDD CUP 2020 赛题详解
  5. 13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比
  6. Spring远程支持和开发RMI服务
  7. ue4集合类型_UE4项目问题集合
  8. 我们究竟该看待百度更新?
  9. 面试题10:二进制中1的个数
  10. 如何移动、删除Mac状态栏图标|Mac小技巧
  11. 用 QuantLib 给国债估值
  12. python 拆分excel单元格_python 操作excel
  13. 2021年高处安装、维护、拆除证考试及高处安装、维护、拆除复审模拟考试
  14. 查找整数c语言程序,查找整数(示例代码)
  15. 全球首家 MUJI 酒店,这里有一份事无巨细的探店体验
  16. 相对路径、绝对路径写法
  17. 解决外网与内网或内网之间的通信,NAT穿透
  18. console.log详解
  19. win10计算机的时间格式,win10系统更改excel时间和日期的格式的图文步骤
  20. 多个域名对应一个ip的解决办法

热门文章

  1. 从巴菲特10亿美元买苹果股 看“硬件公司”的低谷期
  2. Kerberos原理--经典对话
  3. 15. Flash Xss进阶 [ExternalInterface.call第一个参数]
  4. CSV逗号分隔文件打开汉字乱码解决方法
  5. 百度地图开放平台使用教程
  6. 【wpf】自定义事件总结(Action, EventHandler)
  7. c语言中的countif函数,COUNTIF函数高能应用
  8. 一分钟认识低代码维格云
  9. iOS崩溃日志的分析
  10. C 库函数 system/WIFEXITED/WEXITSTATUS