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

第一章 Thread导论

为何要用Thread ?

非阻塞I/O

I/O多路技术

轮询(polling)

信号

警告(Alarm)和定时器(Timer)

独立的任务(Task)

并行算法

第二章 Thread的创建与管理

一、什么是Thread ?

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

只有一个线程的例子:

public class Factorial {

		public static void main(String[] args) {
			int n = 5;
			System.out.print(n + "! is ");
			int fact = 1;
			while (n > 1) {
				fact *= n--;
			}
			System.out.println(fact);
		}

		// 代码的执行步骤是右上至下
		// Java的入口是Main方法
}

有两个线程的例子,即两个任务,应用程序会如何运行?依据所运行的应用程序的条件不同而有所不同。计算机反复交替执行

为什么不用多个应用程序来完成多个任务呢?因为Thread是在同一个应用程序中运行,他们共享在计算机上相同的内存空间,这样可以紧密地共享信息。

多任务环境中的进程:

多线程环境中的线程

二、创建Thread

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

Thread构造函数:

Thread()
          分配新的 Thread 对象。
Thread(Runnable target)
          分配新的 Thread 对象。
Thread(Runnable target, String name)
          分配新的 Thread 对象。
Thread(String name)
          分配新的 Thread 对象。
Thread(ThreadGroup group, Runnable target)
          分配新的 Thread 对象。
Thread(ThreadGroup group, Runnable target, String name)
          分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
          分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小。
Thread(ThreadGroup group, String name)
          分配新的 Thread 对象。

三、Thread的生命周期

1. 启动Thread

class ThreadClass extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println("Helo World! " + i);
		}
	}
}

public class CreateThread {

	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println("Helo World! " + i);
		}
	}

	public static void main(String[] args) {
		CreateThread ourClass = new CreateThread();
		ourClass.run();

		ThreadClass threadClass = new ThreadClass();
		threadClass.start();
	}
}

调用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. 标记

public class RandomCharacterGenerator extends Thread {
	private volatile boolean done = false;

	@Override
	public void run() {
		// ...
		while (!done) {
			// ...
		}
		// ...
	}

	public void setDone() {
		done = true;
	}
}

问题是会出现延迟

2. 中断

class InterruptedThread extends Thread {

	@Override
	public void run() {
		if (!isInterrupted()) {
			//
		}
	}
}

public boolean isInterrupted()

测试线程是否已经中断。线程的中断状态 不受该方法的影响。

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

返回:

如果该线程已经中断,则返回 true;否则返回 false。

public static boolean interrupted()

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

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

返回:

如果当前线程已经中断,则返回 true;否则返回 false。

五、Runnable Interface

使用Runnable接口的线程

public class OurClass {

	public static void main(String[] args) {
		RunnableClass ourRunnableClass = new RunnableClass();
		Thread thread = new Thread(ourRunnableClass);
		thread.start();
	}
}

class RunnableClass implements Runnable {
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println("Helo World! " + i);
		}
	}
}

查看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的创建与管理读书笔记,布布扣,bubuko.com

时间: 2024-10-27 05:02:52

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

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

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException

Java 线程第三版 第九章 Thread调度 读书笔记

一.Thread调度的概述 import java.util.*; import java.text.*; public class Task implements Runnable { long n; String id; private long fib(long n) { if (n == 0) return 0L; if (n == 1) return 1L; return fib(n - 1) + fib(n - 2); } public Task(long n, String id)

Java 线程第三版 第五章 极简同步技巧 读书笔记

一.能避免同步吗? 取得锁会因为以下原因导致成本很高: 取得由竞争的锁需要在虚拟机的层面上运行更多的程序代码. 要取得有竞争锁的线程总是必须等到锁被释放后. 1. 寄存器的效应 计算机有一定数量的主寄存器用来存储与程序有关的数据. 从逻辑上的观点来看,每个Thread都有自己的一组寄存器.当操作系统将某个Thread分配给CPU时,它会把该Thread特有的信息加载到CPU的寄存器中.在分配不同的Thread给CPU之前,它会将寄存器的信息存下来.所以Thread间绝不会共享保存在寄存器的数据.

Java 线程第三版 第六章 高级同步议题 读书笔记

多线程数据同步错误比较难检测,因为通常是与事件的特定发生顺序有关. 一.同步术语 Barrier(屏障) barrier是多个Thread的集合点:所有的Thread都应该到齐在这个barrier之后才能允许它们继续下去. Condition variable(条件变量) 实际上不是变量,而是与某个lock有关联的变量. Event variable(事件变量) 条件变量的另一个名称. Critical section(临界区) 临界区是synchronized方法或者block. Lock(锁

Java 线程第三版 第三章数据同步 读书笔记

多线程间共享数据问题 一.Synchronized关键字 atomic一词与"原子"无关,它曾经被认为是物质的最小的单元,不能再被拆解成更小的部分. 当一个方法被声明成synchronized,要执行此方法的thread必须先取得一个token,我们将它称为锁.一旦该方法取得(或者说是获得)锁,它将运行此方法然后释放掉(或者返回)此锁.不管方法时怎样返回的(包括通过异常)该锁会被释放. 二.Volatile关键字 如果变量被标示为volatile,每次使用该变量时都必须从主寄存器中读出

Java 线程第三版 第八章 Thread与Collection Class 读书笔记

JDK1.2引入最有争议性的改变是将集合类默认为不是Thread安全性的. 一.Collection Class的概述 1. 具有Threadsafe 的Collection Class: java.util.Vector(List) 列表集合,通过索引操作. java.util.Stack(List) 继承自Vector,提供LIFO的顺序操作push进入,pop出元素. java.util.Hashtable(Map) 一个简单.无序的key与value的映射. java.util.conc

Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记

第一章 Thread导论 为何要用Thread ? 非堵塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机运行的应用程序任务(task). 仅仅有一个线程的样例: public class Factorial { public static void main(String[] args) { int n = 5; System.o

补基础:自学:计算机科学导论 第二章 数字系统

2.2 位置化数字系统 在数字中符号所占据的位置决定了其表示的值.在该系统中,数字这样表示: +-(Sk-1  --S2S1S0 --S-l)b 它的值是: n = +-(Sk-1 * bk-1 + -- + S1 * b 1 + S0 * b0 + S-1 * b-1 + -- + S-l * b-l) S是一套符号集,:b是底(或基数),它等于S符号集中的符号总数. 2.2.1 十进制系统(以10为底) 十进制(decimal)来源于拉丁词根decem. 在该系统中,底b = 10, 并且用

算法导论 第二章

2014-12-02 20:21:40 http://www.cnblogs.com/sungoshawk/p/3617652.html 上面链接指向算法导论第二章的预习博客,很值得一看,很详细. 插入算法: 1 #include <iostream> 2 3 using namespace std; 4 void insert_sort(int *datas, int length); 5 int main() 6 { 7 int a[10]={1,2,4,35,6,1,4,7,9,7};