`
metaphy
  • 浏览: 344152 次
  • 性别: 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线程编程学习笔记(二)

    这篇“Java线程编程学习笔记(二)”很可能是对Java并发编程深入探讨的一部分,特别是涉及多线程示例的实践应用。我们将从标题、描述以及标签来推测可能涵盖的知识点,并结合"Multi-Threads Demo"这一压缩包文件名来...

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

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

    Java并发编程学习笔记.rar

    这本"Java并发编程学习笔记"可能是作者在深入研究Java并发特性、工具和最佳实践过程中积累的心得体会。下面,我们将根据这个主题,探讨一些关键的Java并发编程知识点。 1. **线程与进程**:在多任务环境中,线程是...

    JAVA 多线程学习笔记

    这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...

    Java并发编程学习笔记

    Java并发编程是Java开发中必不可少的一部分,涉及到多线程、同步机制、线程池以及并发工具类等多个核心知识点。以下是对这些主题的详细说明: 1. **线程安全与锁 Synchronized 底层实现原理**: 线程安全是指在多...

    java线程学习笔记

    Java 线程学习笔记 Java 线程创建有两种方法: 1. 继承 Thread 类,重写 run 方法:通过继承 Thread 类并重写 run 方法来创建线程,这种方法可以使线程具有自己的执行逻辑。 2. 实现 Runnable 接口:通过实现 ...

    Java游戏编程读书笔记

    通过阅读《Java游戏编程读书笔记》这本书,你可以深入了解这些概念并学习如何将它们应用到实际项目中。文档中的内容可能涵盖了Java游戏开发的基本原理、代码示例、最佳实践以及常见问题的解决方案。通过深入学习和...

    Java基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    java并发编程实践笔记

    2. **确保正确性优先于性能:** 多线程编程中,首先确保程序逻辑的正确性,然后再考虑如何优化性能。 3. **无状态或只读对象是线程安全的:** 如果一个对象不包含任何状态信息(即无状态)或其状态不会改变(只读)...

    Java JDK 7学习笔记 PDF

    3. **多线程改进**:JDK 7提供了`Fork/Join`框架,这是一种基于工作窃取算法的并行编程模型,用于高效地执行大量可分解的任务。 4. **try-with-resources语句**:这个新特性允许自动关闭实现了`AutoCloseable`接口...

    java并发编程学习笔记

    ### Java并发编程学习笔记知识点详解 #### 一、Java并发编程概述 Java并发编程是指在Java应用程序中同时执行多个操作的技术。它通过多线程、线程池等机制实现资源的有效利用,提高程序运行效率。Java并发编程的...

    多线程学习笔记

    多线程学习笔记 iOS开发中,多线程是一种常见的技术手段,用于优化应用程序的性能,提升用户体验。多线程的核心是让程序能够并发地执行多个任务,合理地利用设备的计算能力,尤其是在拥有多个核心的处理器上。 ...

    (完整版)最全的java学习笔记(必看).pdf

    * 1.1 编程语言:Java是一种面向对象的编程语言,具有跨平台、动态加载、多线程等特点。Java语言的设计目标是提供一种通用的、基于对象的、高度面向对象的编程语言。 * 1.2 Java特点:Java语言的特点包括平台独立性...

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    Java 学习笔记Java学习笔记

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。...Java学习笔记涵盖了这些核心知识点,通过深入学习和实践,你可以逐步掌握Java编程,并应用于实际项目开发中。

    Java并发编程学习笔记.

    2. **并发基础**:Java并发编程的基础包括`Thread.start()`启动线程,`Thread.join()`等待线程结束,以及`Thread.sleep()`让当前线程暂停一段时间。 3. **同步机制**:Java提供了多种同步机制,如`synchronized`...

Global site tag (gtag.js) - Google Analytics