第一章 Thread导论

为何要用Thread ?

非堵塞I/O
     I/O多路技术
     轮询(polling)
     信号
警告(Alarm)和定时器(Timer)
独立的任务(Task)
并行算法


第二章 Thread的创建与管理

一、什么是Thread ?

    Thread是所在主机运行的应用程序任务(task)。


仅仅有一个线程的样例:
  1. public class Factorial {
  2.  
  3. public static void main(String[] args) {
  4. int n = 5;
  5. System.out.print(n + "! is ");
  6. int fact = 1;
  7. while (n > 1) {
  8. fact *= n--;
  9. }
  10. System.out.println(fact);
  11. }
  12.  
  13. // 代码的运行步骤是右上至下
  14. // Java的入口是Main方法
  15. }



有两个线程的样例。即两个任务,应用程序会怎样执行?根据所执行的应用程序的条件不同而有所不同。计算机重复交替执行
为什么不用多个应用程序来完毕多个任务呢?由于Thread是在同一个应用程序中执行,他们共享在计算机上同样的内存空间,这样能够紧密地共享信息。

多任务环境中的进程:


多线程环境中的线程    



二、创建Thread

线程创建有两种方式,继承自Thread 与 使用实现Runnable接口

Thread构造函数:
  1. Thread()
  2. 分配新的 Thread 对象。
  3.  
  4. Thread(Runnable target)
  5. 分配新的 Thread 对象。
  6. Thread(Runnable target, String name)
  7. 分配新的 Thread 对象。
  8.  
  9. Thread(String name)
  10. 分配新的 Thread 对象。
  11. Thread(ThreadGroup group, Runnable target)
  12. 分配新的 Thread 对象。
  13.  
  14. Thread(ThreadGroup group, Runnable target, String name)
  15. 分配新的 Thread 对象。以便将 target 作为其执行对象,将指定的 name 作为其名称。并作为 group 所引用的线程组的一员。
  16.  
  17. Thread(ThreadGroup group, Runnable target, String name, long stackSize)
  18. 分配新的 Thread 对象,以便将 target 作为其执行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员。并具有指定的堆栈大小。
  19. Thread(ThreadGroup group, String name)
  20. 分配新的 Thread 对象。

三、Thread的生命周期

1. 启动Thread
  1. class ThreadClass extends Thread {
  2. @Override
  3. public void run() {
  4. for (int i = 0; i < 5; i++) {
  5. System.out.println("Helo World! " + i);
  6. }
  7. }
  8. }
  9.  
  10. public class CreateThread {
  11.  
  12. public void run() {
  13. for (int i = 0; i < 5; i++) {
  14. System.out.println("Helo World! " + i);
  15. }
  16. }
  17.  
  18. public static void main(String[] args) {
  19. CreateThread ourClass = new CreateThread();
  20. ourClass.run();
  21.  
  22. ThreadClass threadClass = new ThreadClass();
  23. threadClass.start();
  24. }
  25. }

调用Thread子类的start方法都会运行run方法。
从log能够看出是在两个线程中。但线程都是线性从前往后运行的。

public void run()

     假设该线程是使用独立的 Runnable 执行对象构造的,则调用该 Runnable 对象的 run 方法;否则。该方法不执行不论什么操作并返回。

     Thread 的子类应该重写该方法。 

public void start()
使该线程開始运行;Java 虚拟机调用该线程的 run 方法。

结果是两个线程并发地执行;当前线程(从调用返回给 start 方法)和还有一个线程(执行其 run 方法)。 
多次启动一个线程是非法的。特别是当线程已经结束运行后。不能再又一次启动。 

2. Thread的终结
Thread的启动会运行run方法,当run中的方法运行完最后一行后,线程就自然终结。
停止线程
public final void stop()

     已过时。

强迫线程停止运行。


3. Thread的暂停、挂起、恢复
休眠
public static void sleep(long millis) throws InterruptedException

     在指定的毫秒数内让当前正在运行的线程休眠(暂停运行)。此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失不论什么监视器的所属权。


public static void sleep(long millis, int nanos) throws InterruptedException

     在指定的毫秒数加指定的纳秒数内让当前正在运行的线程休眠(暂停运行)。此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失不论什么监视器的所属权。


     sleep()方法的最简单的描写叙述是:调用者会睡眠一段制定的时间。

4. Thread的善后
线程连接
public final void join(long millis) throws InterruptedException

     等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。


public final void join(long millis, int nanos) throws InterruptedException

     等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。

public final void join() throws InterruptedException

     等待该线程终止。 

四、两种停止Thread的方式

1. 标记
  1. public class RandomCharacterGenerator extends Thread {
  2. private volatile boolean done = false;
  3.  
  4. @Override
  5. public void run() {
  6. // ...
  7. while (!done) {
  8. // ...
  9. }
  10. // ...
  11. }
  12.  
  13. public void setDone() {
  14. done = true;
  15. }
  16. }

问题是会出现延迟

2. 中断
  1. class InterruptedThread extends Thread {
  2.  
  3. @Override
  4. public void run() {
  5. if (!isInterrupted()) {
  6. //
  7. }
  8. }
  9. }

public boolean isInterrupted()

     測试线程是否已经中断。

线程的中断状态 不受该方法的影响。 

     线程中断被忽略,由于在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。 

     返回:

     假设该线程已经中断。则返回 true;否则返回 false。


public static boolean interrupted()

     測试当前线程是否已经中断。

线程的中断状态 由该方法清除。换句话说。假设连续两次调用该方法,则第二次调用将返回false(在第一次调用已清除了当中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。

线程中断被忽略,由于在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。

返回:

     假设当前线程已经中断。则返回 true;否则返回 false。



五、Runnable Interface

使用Runnable接口的线程
  1. public class OurClass {
  2.  
  3. public static void main(String[] args) {
  4. RunnableClass ourRunnableClass = new RunnableClass();
  5. Thread thread = new Thread(ourRunnableClass);
  6. thread.start();
  7. }
  8. }
  9.  
  10. class RunnableClass implements Runnable {
  11. @Override
  12. public void run() {
  13. for (int i = 0; i < 5; i++) {
  14. System.out.println("Helo World! " + i);
  15. }
  16. }
  17. }

查看Runnable源代码

六、Thread与对象

判别当前的Thread
public static Thread currentThread()

     返回对当前正在运行的线程对象的引用。


线程的生命周期
public final boolean isAlive()

     測试线程是否处于活动状态。假设线程已经启动且尚未终止,则为活动状态。
 

线程的命名
public final void setName(String name)

     改变线程名称,使之与參数 name 同样。

     首先调用线程的 checkAccess 方法,且不带不论什么參数。这可能抛出 SecurityException。

public final String getName()

     返回该线程的名称。



public Thread(String name)

     分配新的 Thread 对象。这样的构造方法与 Thread(null, null, name) 具有同样的作用。     



public Thread(ThreadGroup group, String name)

     分配新的 Thread 对象。这样的构造方法与 Thread(group, null, name) 具有同样的作用。     

每一个线程都设置名字便于问题的跟踪与定位。 


Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记的更多相关文章

  1. Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  2. Java 螺纹第三版 第三章数据同步 读书笔记

    多线程间共享数据问题 一.Synchronizedkeyword      atomic一词与"原子"无关,它以前被觉得是物质的最小的单元,不能再被拆解成更小的部分.      当 ...

  3. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  4. 疯狂java讲义 第三版 笔记

      java7新加特性: 0B010101  二进制数 int c=0B0111_1111;   数值中使用下划线分隔 switch 支持String类型   字符串常量放在常量池 String s0 ...

  5. 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具

    计算机图形学 opengl版本 第三版------胡事民 第四章  图形学中的向量工具 一   基础 1:向量分析和变换   两个工具  可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...

  6. Java 线程第三版 第四章 Thread Notification 读书笔记

    一.等待与通知 public final void wait() throws InterruptedException      等待条件的发生. public final void wait(lo ...

  7. 《Effective Java 第三版》新条目介绍

    版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...

  8. 深入理解Java虚拟机第三版,总结笔记【随时更新】

    最近一直在看<深入理解Java虚拟机>第三版,无意中发现了第三版是最近才发行的,听说讲解的JDK版本升级,新增了近50%的内容. 这种神书,看懂了,看进去了,真的看的很快,并没有想象中的晦 ...

  9. C#本质论读书笔记:第一章 C#概述|第二章 数据类型

    第一章 1.字符串是不可变的:所有string类型的数据,都不可变,也可以说是不可修改的,不能修改变量最初引用的数据,只能对其重新赋值,让其指向内存中的一个新位置. 第二章 2.1 预定义类型或基本类 ...

随机推荐

  1. Ch03 视图基础

    3.1  视图简介 3.1.1  选择待渲染视图 3.1.2  重写视图名 3.2  给视图传递数据 3.2.1  ViewDataDictionary 3.2.2  ViewBag 3.2.3  带 ...

  2. NET 2016

    .NET 2016   阅读目录 初识 .NET 2016 使用 .NET Framework 4.6 编译应用程序 使用 .NET Core CLI 编译应用程序 小结 厚积薄发这个词是高三英语老师 ...

  3. COCOS2D-X之圆形进度条的一个简单Demo

    这应该是游戏中很常见的一个效果.显示某个事件的进度等,在加载资源或者联网的时候经常用到.所以有必要学习学习 一.我们直接在COCOS2D-X自带的HelloCpp的工程中添加代码即可.我们在初始化中添 ...

  4. hdu2492 Ping pong

    hdu2492 Ping pong 题意:一群乒乓爱好者居住在一条直线上,如果两个人想打比赛需要一个裁判,裁判的 位置 必须在两者之间 ,裁判的能力也必须不大于 参赛者最大的,不小于参赛者最小的 白皮 ...

  5. hadoop部署、启动全套过程

    Hadoop是Apache基金会的开源项目,为开发者提供了一个分布式系统的基础架构,用户可以在不了解分布式系统的底层细节的情况下开发分布式的应用,充分利用集群的强大功能,实现高速运算和存储.Hadoo ...

  6. VB.net总结

    .NET视频差点儿相同用时一周结束,总体感觉就是"走耳不走脑".刚開始看视频理解起来有一点困难,台湾口音以及台湾与大陆计算机术语的差异,让我把前几集相当于直接忽略过了(建议打算看这 ...

  7. 重操JS旧业第五弹:函数

    函数在任何编程语言中起着非常重要的位置,因为他是功能的最小单元,在js中函数是一种类型 Function 1 申明与定义 显示声明:function cc(){};函数名其实是函数的一个指针,函数名某 ...

  8. Axure快捷键大全 Axure RP Pro 6.5快捷键

    习惯用Axure快捷键会让你做原型的时候更得心应手.Axure中文网总结了常用的一些快捷键分享给大家 . Axure RP Pro 6.5快捷键大全,如有疏漏,欢迎补充. 基本快捷键:   打开:Ct ...

  9. Windows Service的安装卸载 和 Service控制

    原文 Windows Service的安装卸载 和 Service控制 本文内容包括如何通过C#代码安装Windows Service(exe文件,并非打包后的安装文件).判断Service是否存在. ...

  10. 深入浅出OpenStack云计算平台管理(nova-compute/network)

    一.本课程是怎么样的一门课程(全面介绍)          1.1. 课程的背景           OpenStack是 一个由Rackspace发起.全球开发者共同参与的开源项目,旨在打造易于部署 ...