java编程思想阅读笔记(十一)并发

原创 2012年03月30日 20:59:36

    继续把笔记整理着。并发多线程的东西说起来就很多了,如果说复杂,要是线程之间的交集较多的话(交互啊,共享资源等等),确实很棘手,而且往往测试还是个大问题,再扯上性能稳定之类云云就。。。;如果说处理的逻辑清晰简单,那么它也挺简单的,似乎只要实现Runable接口,并通过Thread类或者Executor接口(Executor、ExecutorService)管理就好了;个人的感觉首先把逻辑、状态转换、交互理清了,后续会少很多麻烦的。


    1.基本线程机制
   (1)首先谈Runnable接口,可以看到其本身只有一个run方法,在类的run方法中开启另一个线程。而为了想对创建的线程增加些管理的功能,可以使用Thread类(实现了Runnable,因此可以继承Thread而覆盖run方法)。看看几个方法:
    start(),使该线程开始执行,但是不能多次启动
    sleep(long millis),静态方法,是线程休眠指定的毫秒数
    getPriority() ,setPriority(int newPriority) 获得和设定线程的优先级,当然只有MAX_PRIORITY ,MIN_PRIORITY,NORM_PRIORITY三种
    setDaemon(boolean on),使线程变为后台(守护)线程
    join(),等待线程终止
    还有判断是否中断等等,当然可以查看手册,但是发现这种多线程的方法是没有返回值的,可以有异常;
   (2)Callable<V>接口,可以给你带回想要的返回值泛型V,但是必须使用ExecutorService.submit(  );这里有个疑问是为什么Runnable接口是在java.lang的包中的,而Callable<V>在java.util.concurrent包中。
   (3)在java.util.concurrent包中的ExecutorService,实现了Executor接口,想想看看线程池

    ExecutorService exec = Executors.newCachedThreadPool()  或者FixedThreadPool()


    2.共享受限资源

    对于多个线程或进程共享受限的资源,可以通过加锁的方式,lock(检查锁是否可用,否阻塞;是获取锁执行,释放锁),trylock(尝试获取锁,可以获得则执行,否则直接返回);另一种方式就是给需要共享的代码加上Synchronized关键字,类似于锁定;从书中后面的从性能角度分析的,显示地使用lock更稳定,而Synchronized在较少而且简单的情况下才好些(那为什么要搞出这么一个关键字?为了更抽象和简单?因为lock和trylock在c中是很常用的方式,至于什么互斥量、信号量的我就不写了,因为和C中的似乎没有区别)。而对于受限资源的访问老是有个死锁的问题,只要避免那四个条件同时发生:资源的互斥访问(资源至少有一个是非共享的),有等待,访问资源构成循环,而且互相之间不能抢占;说的不严谨,其实意思就是当多个线程或进程访问一些资源时,如果这些资源存在至少一个是非共享的,那么当一个线程拥有一个资源等待另一个非共享的资源而阻塞时,另一个线程拥有这个非共享资源而等待被其它线程使用的非共享资源(或者等待其它想要这个非共享资源的线程运行完毕),而且不能抢占资源,造成了相互等待而不能运行的结局。


   3.简单的提到一下新类库中的构件。CountDownLatch:同步一个或多个任务,强制它们等待由其它任务执行的一组操作完成(而且是只触发一次事件),CyclicBarrier:多个任务一致向前执行。
   4.线程之间的协作,其实上面的锁啊,信号量啊,新构件啊就是一些方式;然后呢,还有些wait——notify  notifyAll()
interrupt()——Thread.interrupted()的方法;这里也有C中经常用到的signal()的。
    我这里只是把一些看到的,可能用的到的概念之类的提到,但是具体的使用只有在真正用到的时候才能发挥它的力量。我自己是感觉用的不多的话,多做练习似乎只能加深些印象,时间长了不用还是会忘;而对于真正的协作,性能,稳定的说法就只能说说了。
版权声明:本文为博主原创文章,转载请注明出处。

java编程思想(十一)总结

第十二章 Java I/O系统 12.1 File类 它既能表示特定文件的名称,又能表示目录下一组文件的名称 目录列表器(FilenameFilter接口):需实现accept()方法,一般使用正则表...

Java编程思想(十一) —— 通过异常处理错误(下)

Java编程思想(十) —— 通过异常处理错误(2)
  • iaiti
  • iaiti
  • 2014年09月12日 08:35
  • 1957

《JAVA编程思想》阅读笔记之对于对象的理解(1)

一种面向对象的语言——java,刚接触java的时候就听到了一个这样的例子:什么是面向对象,那先来举个例子,我早上醒来,我起来之后先上了个厕所,我上完厕所之后开始穿衣服、洗漱,然后 我吃早饭。这个“我...

《Java编程思想》阅读笔记之第一章对象导论

《Java编程思想》阅读笔记之第一章对象导论 第一章是绪论部分,讲解了Java作为面向对象方法中最重要的“对象”的概念。在面向对象的方法中,强调一切皆对象。不同于传统的基于计算机结构的面向过程的方法...

java编程思想阅读笔记(四)接口与内部类

继续记笔记,发现自己一写Java程序,还是又忘东忘西的,看来这本不太适合纯基础的学习,或者是自己写c写得太久了,不过现查也还够我用。    (1)接口     先摘抄一些话:     接口和内部...

java编程思想阅读笔记(六)异常处理

“Java的基本理念是:结构不佳的代码不能运行。”,从我原来使用Java的异常机制的感觉是不太喜欢的,因为他将整个异常的调用轨迹都放出来了,给人一种恐怖的感觉,现在慢慢体会着这里面的种种好处,感受着他...

java编程思想阅读笔记(二)

创建字符串数组时,可以用这种方式String[] str = ("a b c").split(" "); 输出数组:System.out.println(Arrays.toString(str));...

java编程思想阅读笔记(九)数组和容器

Java编程思想,注重的应该是思想,我怎么笔记记得就是Java语法细节呢,很多例子的设计的思想也都没有写出来,个人感觉还是缺少实际的操作实践参考和分析的缘故吧;而且本身里面很多的设计模式方面的也没有写...

java编程思想阅读笔记(十)I/O系统(下)

补充下对象序列化的相关内容。至于XML读写之类的就不写了,无非也就是按照规定方式读写的东西。     对象的序列化将那些实现了Serializable(Externalizable)接口的对象转换成...

java编程思想阅读笔记(一)

主要类型: byte 8位 short 16位 int 32位 long 64位 boolean 1位 char 16位 float 32位 double 64位 主数据类型也有自己的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java编程思想阅读笔记(十一)并发
举报原因:
原因补充:

(最多只允许输入30个字)