`
metaphy
  • 浏览: 339618 次
  • 性别: Icon_minigender_1
  • 来自: 大西洋底
社区版块
存档分类
最新评论

Java线程编程学习笔记(一)

阅读更多

"Java Thread Programming" by Paul Hyde

(本书在Amazon.com 5星推荐,不幸的是成书较早,内容都是针对JDK1.2的,不知道有没有关于新版本的)


2009.4.1


1.即使最简单的Java程序,比如打印“hello world”到Console,也运行在一个多线程的环境中(会有2个线程):main线程和垃圾收集线程。一个有GUI的Java程序更是多线程的,包含:事件分派线程和Painting GUI窗口的线程。


2.线程不是“免费的”。内存方面,每个Thread对象,除了本身需要的内存空间,还需要2个execution call stack,一个栈用来保存Java方法和变量的轨迹(track),另一个保存本地代码(如,c代码)的执行轨迹。CPU方面,需要执行叫做“context switching”的额外工作(就是挂起某个线程,保存该线程的场景,执行另一线程)。另外的开销就是“Thread”对象本身,考虑这样的情形:每5 minutes检查一次是否有新邮件;你不必每次都创建new thread,而应该让一个线程在“running”和“sleep”状态之间轮转。


3.Java的多线程是: Easy to Start,Tough to Master.  (深有体会)


4.线程的执行顺序问题:一定要记住,线程的循序可能会有多种!

比如:    

state1();

t.start();

state2();


其中,线程t的run方法是:

void run(){

  stateA();

}


执行顺序有可能是state1();state2();stateA(); 也有可能:state1();stateA();state2().


Caution:

A newly created thread may start executing (enter the run() method) at any time after start() is invoked. This means that the original thread might be swapped out before any statement that follows start() is executed.


5.线程从run()方法进入,在run()方法结束后死掉。死掉的线程无法restarted.


6.线程的启动使用t.start()方法。start()方法将会立即返回(return),并没有等到其他线程开始执行才返回。


7.native标明代码非Java code,而是JDK里的C/C++代码.

Many of the methods in Thread are listed with some of the following modifiers: native, final, static, and synchronized. As a quick review, native methods are implemented in non-Java code (typically C or C++ in the JDK).


8. 除了main thread外,Java VM 还会自动启动下面的thread(Java 1.2):

main

Finalizer

Reference Handler

Signal dispatcher

AWT-Windows

AWT-EventQueue-0

SunToolkit.PostEventQueue-0

Screen Updater


9.ThreadGroup/Thread 概念可类比文件系统的文件夹/文件概念

In Java, a ThreadGroup (much like a directory) can contain Threads and other ThreadGroups.


10.Thread.sleep()只能应用在当前线程,即Thread.currentThread上;在一个线程里对另一个调用sleep是不可能的。


11. volatile keyword:

the modifier volatile is included for some of the member variables. By indicating that a member variable is volatile, you inform the JavaVM that its value might be changed by one thread while being used by another. 


12.while(keepRunning){Thread.sleep(100);....} 使用这样的休眠时间,不会得到准确的秒针走动!因为这样除了休眠的100ms,还有其他代码运行的时间;加起来要比实际想要得到的时间慢。事实上,要让这样的时钟跟实际时钟同步,需要用变量sleeptime,即这样:Thread.sleep(sleepTime); sleepTime需要不断根据系统时钟来调整。


13. SecurityException是RuntimeException,因此不需要try/catch。所有的RuntimeException都不需要try/catch.


14. busy wait是对CPU资源的浪费,应当避免,替代以wait/notify方式。busy wait看起来像这样,即循环变量的更改依靠其他线程:

while (suspended) {

  Thread.sleep(200);

}


15. 守护线程(Daemon Threads)

守护线程用来做后台支持任务,只有当正常、非守护线程还在运行时候才需要。当VM检测到只剩下守护线程了,VM就会exit;否则如果还有非守护线程在运行,VM won't exit.

设置一个线程为守护线程,使用setDaemon(true)方法:

  Thread t = new XXXThread();

  t.setDaemon(true);


16.一个线程的优先级往往和制造它的线程优先级相同。main线程的优先级是5.大多数线程都是直接或间接有main产生的。因此大多数线程的优先级是5. 一般而言,线程的优先级在整个生命期间并不改变,但它确实可以改。


17.线程优先级对线程调度器而言,仅是一个“建议”,它并不能保证程序确实那样运行。不同的VM实现(implementation)对于线程调度问题差异很大。


18.Thread.yield()用来交出一个线程的运行权。线程调度器将终止当前线程的运行,去调度另外线程。yield不要乱用。


19.对一个方法加synchronized,表示:每次只允许一个线程进入这个方法。


20.定义public void synchronized doStuff(int val)会出错;正确应该是public synchronized void doStuff(int val)


21. 类的每个实例都有一个自身的对象级别锁。


22. 类级别的锁可以用来控制对static成员变量的并发访问,使用下面代码来事先类级别的锁:

synchronized ( ClassName.class ) {

  // body

}


23. 避免死锁是非常困难的,尝试遵循下面的原则:

1)尽量减少Hold lock的时间。对语句块使用synchronized;而不是对整个方法都使用

2)避免让代码一次占有2个或以上的lock。如果不能避免,就让占有第二个lock的时间尽量缩短

3)使用一个“大”的锁代替多个小的锁,使用这个锁来替代对象级别的lock


24. 为了避免"过早通知"(early notifications),应该将wait()置于while循环中,而不是if判断中;这样可以保证wait()之后总会有条件判断。


25. thread.join()

Thread的join()方法用来阻滞当前线程的运行,直到某特定线程死亡。例:threadX运行下面的代码,

try {

threadY.join();

} catch ( InterruptedException x ) {

}

threadX会阻塞,直到threadY死掉。

 

2
0
分享到:
评论

相关推荐

    Java并发编程学习笔记 pdf 多线程编程

    Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...

    Java线程编程学习笔记(二)

    NULL 博文链接:https://metaphy.iteye.com/blog/406870

    Java并发编程学习笔记

    目前,在Java并发编程方面论述系统、内容详实的中文资料很少。本文是作者在实际工作中经验总结,部分内容来自《Java Concurrency In Practice》。...读完前八章即可应付一般的 Java 多线程编程任务。

    java多线程编程笔记

    java多线程编程笔记,本人亲自整理的,适合于初学java的同学们,相信通过努力学习我们一定会对java有个初步的了解

    java学习笔记

    java学习笔记大全:java内容介绍 java编程可以分成三个方向: 1、java se (j2se)桌面开发 java中的基础中的基础 2、java ee (j2ee)web开发 3、java me (j2me)手机开发 java se课程介绍 java面向对象编程(基础) java...

    瑜琅java学习笔记

    1 java起源 2 java语言概述 3 简单(基本)数据类型 4 运算符:java...8 继承:继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类 9 包和接口 10异常处理 11多线程编程 12输入/输出、小应用程序and others

    Java/JavaEE 学习笔记

    Java/JavaEE 学习笔记 作者在杰普学习时的学习笔记,是J2ee初学者必备手册,是大家学习J2EE开发的很好的参考笔记。 Java/JavaEE 学习笔记 内容目录: Unix 学习笔记..........7 一、Unix前言............7 二、...

    JAVA学习笔记

    JAVA学习笔记,包含JAVA编程思想,JAVA多线程设计模式,JAVA网络编程,以及JAVA NIO,适合初学者学习JAVA语言及项目开发模式

    java学习笔记 达内笔记(经典)

    (二)面向对象技术总结.pdf (三)corejava高级特性总结 (四)接口学习总结 (五)异常和内部类 (六)集合框架学习总结 (七)GUI和AWT事件模型 (八)多线程学习总结 (九)输入输出流学习总结 (十)网络编程学习总结

    Java面试题和学习笔记

    Linux面试专题及答案+ActiveMQ消息中间件面试专题+Java基础面试题+MySQL性能优化的21个最佳实践+微服务面试专题及答案+深入理解java虚拟机+设计...专题及答案+java多线程并发编程知识导图笔记+Java并发体系知识导图笔记...

    java学习笔记_多线程网络编程.txt

    java学习笔记_多线程网络编程.txt,包括多线程、网络编程、网络模型、TCP客户端和服务端代码

    学习笔记:多线程Java Socket编程示例

    其中采用Java 的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求....注意,此为学习笔记,可以作为参考学习使用,不建议商业使用或生产使用。 废话不多说,直接上代码。

    Java学习笔记

    自己在java学习过程中的笔记,从最基础的创建java环境,java的基础知识,java变量的内存存储过程,到容器,异常,多线程等都有详尽涉及。 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里...

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...

    JAVA并发编程实践-线程执行-学习笔记

    围绕任务执行来管理应用程序时,第一步要指明一个清晰的任务边界,理想情况下,任务是 独立活动的,它的工作并不依赖于其他任务的状态、结果或边界效应,独立有利于并发性。应用程 序应该在负荷过载时平缓地劣化,而...

    java学习笔记java学习笔记

    答:1) 简单(Java语法是C++语法的一个“纯净”版本); 2) 可移植性 3) 面向对象 4) 分布式(Java把打开套接字连接等繁琐的网络任务变得非常容易) 5) 健壮性(Java编译器会检查出很多其他语言在运行时刻才显示出来...

    JAVA并发编程实践-线程安全-学习笔记

    线程安全就是对共享的、可变的状态进行管理,对象的状态就是它的数据,换句话说就是在不可控制的并发访问中保护数据。

    黑马程序员–Java多线程讲解笔记

    一个进程中至少要有一个线程。当一个进程中线程有多个时,是多线程。  为什么要用多线程  1,让计算机"同时"做多件事情,节约时间。  2,后台运行程序,提高程序的运行效率.。  3,多线程可以让程序...

    韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)-共448页.docx

    java多线程编程 java ee基础1 java面向对象编程--数据库编程-->java se java 基础2 html--css--javascript-->div+css java ee中级部分 Servlet--Jsp-->mvc模式 java ee高级部分 Struts--Ejb--Hibernate--Spring--...

Global site tag (gtag.js) - Google Analytics