- 浏览: 69209 次
- 性别:
- 来自: 北京
文章分类
最新评论
一、新建线程
线程是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。通常,每一个任务称为一个线程(thread),可以同时运行一个以上线程的程序成为多线程程序(multithreaded)。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。
非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常。
创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。例如,计算大于某一规定值的质数的线程可以写成:
然后,下列代码会创建并启动一个线程:
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:
然后,下列代码会创建并启动一个线程:
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。
警告:不要调用Thread类或Runnable对象的run()方法。直接调用run()方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start()方法。这个方法将创建一个执行run()方法的新线程。
二、中断线程
1. Thread.stop, Thread.suspend, Thread.resume
和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的!
现在,如果你要安全有效地终止一个线程,应该采用以下这些方法:
* 线程正常执行完毕,正常结束。
* 监视某些条件,结束线程的不间断运行。
* 捕获InterruptedException 运行时异常,中断当前线程。
摘自:JAVA中断线程的方法
2. 注意Thread.interrupt()方法并不会真正中断线程。但当在一个被阻塞的线程上调用interrupt()方法时,阻塞调用将会被InterruptedException异常中断。
三、线程状态
1. New(新生)
2. Runable(可运行)
3. Blocked(被阻塞)
4. Waiting(等待)
5. Timed waiting(计时等待)
6. Terminated(被终止)
四、线程属性
1. 线程优先级
在Java 程序设计语言中,每一个线程都有一个优先级。但是,线程优先级是高度依赖于操作系统的。当虚拟机依赖于宿主机平台的线程实现机制时,Java线程的优先级被映射到宿主机的优先级上,优先级个数也许更多,也许更少。
使用void setPrority(int newPriority)设置线程优先级。
警告:如果确实要使用优先级,应该避免一个错误:如果有几个高优先级的线程没有进入非活动状态,低优先级的线程可能永远也不能执行。每当调度器决定运行一个新线程时,首先会在具有较高优先级的线程中进行选择,尽管这样会使低优先级的线程完全饿死。
2. 守护线程
可以在线程启动之前调用void setDaemon(true);将线程转换为守护线程(daemon thread)。当只剩下守护线程时,虚拟机就退出了。
3. 线程组
4. 处理未捕获异常的处理器
五、锁对象
1. java.util.concurrent.locks.Lock
2. java.util.concurrent.locks.ReentrantLock
注意Lock只能对同一对象的行为加锁,不同对象之间的Lock没有影响。
六、条件对象
1. java.util.concurrent.locks.Condition
七、synchronized
八、volatile
线程是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。通常,每一个任务称为一个线程(thread),可以同时运行一个以上线程的程序成为多线程程序(multithreaded)。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。
非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常。
创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。例如,计算大于某一规定值的质数的线程可以写成:
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
然后,下列代码会创建并启动一个线程:
PrimeThread p = new PrimeThread(143); p.start();
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
然后,下列代码会创建并启动一个线程:
PrimeRun p = new PrimeRun(143); new Thread(p).start();
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。
警告:不要调用Thread类或Runnable对象的run()方法。直接调用run()方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start()方法。这个方法将创建一个执行run()方法的新线程。
二、中断线程
1. Thread.stop, Thread.suspend, Thread.resume
和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的!
现在,如果你要安全有效地终止一个线程,应该采用以下这些方法:
* 线程正常执行完毕,正常结束。
* 监视某些条件,结束线程的不间断运行。
* 捕获InterruptedException 运行时异常,中断当前线程。
摘自:JAVA中断线程的方法
2. 注意Thread.interrupt()方法并不会真正中断线程。但当在一个被阻塞的线程上调用interrupt()方法时,阻塞调用将会被InterruptedException异常中断。
package test; public class 多线程 { public static void main(String[] args) { Thread t01 = new Thread(new MyRun()); /* * 1. 不启动线程结果: * false * false * * 2. 启动线程结果: * false * true * * 3. MyRun.run()中调用Thread.sleep(10000); * false * 抛出异常: InterruptedException */ t01.start(); System.out.println(t01.isInterrupted()); t01.interrupt(); System.out.println(t01.isInterrupted()); } } class MyRun implements Runnable{ public void run() { System.out.println(Thread.currentThread()); // try...catch... // Thread.sleep(10000); } }
三、线程状态
1. New(新生)
2. Runable(可运行)
3. Blocked(被阻塞)
4. Waiting(等待)
5. Timed waiting(计时等待)
6. Terminated(被终止)
四、线程属性
1. 线程优先级
在Java 程序设计语言中,每一个线程都有一个优先级。但是,线程优先级是高度依赖于操作系统的。当虚拟机依赖于宿主机平台的线程实现机制时,Java线程的优先级被映射到宿主机的优先级上,优先级个数也许更多,也许更少。
使用void setPrority(int newPriority)设置线程优先级。
警告:如果确实要使用优先级,应该避免一个错误:如果有几个高优先级的线程没有进入非活动状态,低优先级的线程可能永远也不能执行。每当调度器决定运行一个新线程时,首先会在具有较高优先级的线程中进行选择,尽管这样会使低优先级的线程完全饿死。
2. 守护线程
可以在线程启动之前调用void setDaemon(true);将线程转换为守护线程(daemon thread)。当只剩下守护线程时,虚拟机就退出了。
3. 线程组
4. 处理未捕获异常的处理器
五、锁对象
1. java.util.concurrent.locks.Lock
2. java.util.concurrent.locks.ReentrantLock
注意Lock只能对同一对象的行为加锁,不同对象之间的Lock没有影响。
package test; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class 多线程02 { public static void main(String[] args) { MyRun02 mr = new MyRun02(); // 三个线程中分别是不同MyRun02对象,所以Lock并没有起到相应的作用。 Thread t01 = new Thread(new MyRun02()); Thread t02 = new Thread(new MyRun02()); Thread t03 = new Thread(new MyRun02()); // 三个线程中分别是同一个MyRun02对象,所以Lock起到了相应的作用。 // Thread t01 = new Thread(mr); // Thread t02 = new Thread(mr); // Thread t03 = new Thread(mr); t01.start(); t02.start(); t03.start(); } } class MyRun02 implements Runnable{ public void run() { try{ for(int i = 0; i < 3; i++){ lock.lock(); System.out.println(Thread.currentThread()); Thread.sleep(1000); lock.unlock(); } }catch (InterruptedException e) { e.printStackTrace(); } } private Lock lock = new ReentrantLock(); }
六、条件对象
1. java.util.concurrent.locks.Condition
七、synchronized
八、volatile
发表评论
-
API设计反模式
2012-03-02 10:49 01. 抛出程序无法解决的异常 privat ... -
Use Piped Stream
2010-08-03 17:14 1412本文的目标是设计一个基于Swing的JTextArea显 ... -
Java version history
2010-07-27 17:46 746[References] 1. Jav ... -
Understanding the IBM Java Garbage Collector Series
2010-07-27 15:04 799The series will tell you how to ... -
All about JAR (uncomplete)
2010-07-09 16:18 736[参考] 1. MANIFEST.MF 文 ... -
Configure JAR Associate With Javadoc in Eclipse
2010-07-09 16:10 831Resolution: 1. create Javad ... -
JAVA与UNICODE
2010-07-01 17:24 750 -
JAVA Flost-point Number
2010-07-01 17:18 838[参考] 1. http://user ... -
JAVA断言
2010-06-29 17:34 1365JAVA断 言使用 [转 ... -
JVM载入类过程
2010-06-17 17:35 782下面的流程为执行Terminator类中main()方法的流程 ... -
JSP字符集(编码)思考集
2010-06-08 17:47 790[参考] 1. 参数编码规 ... -
NioBuffer Invariants
2010-05-27 15:12 868Java Nio Buffer 中包含了下面展示出来的一 ... -
Java运算符和优先级
2010-05-24 17:42 1138优先级 运算符 结合性 ... -
TOMCAT 资料总汇
2010-04-22 17:27 722developerWorks 中国 > Java ... -
Dynamic code downloading using JavaTM RMI
2010-04-22 16:49 729(Using the java.rmi.server.co ... -
OLTP以及OLAP
2010-04-01 09:50 894引言 当今的 ... -
学习网址
2010-03-28 22:31 665一、位运算 http://www.matrix67.c ... -
ASCII码表
2010-03-28 22:22 1036wiki: ASCII ASCII Table (7- ... -
native2ascii
2010-03-25 17:10 833一、native2ascii位置 %JAV ... -
关于版本符号
2010-03-12 22:04 961不论对错 仅供参考 ...
相关推荐
Java多线程笔记 Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,...
以下是对马士兵多线程笔记的详细解析。 1. **多线程基础**:多线程是指一个应用程序中同时执行多个线程(即任务)的能力。这种并发执行可以提高系统资源的利用率,提升程序的响应速度和执行效率,特别是在多核...
Java线程的知识点总结。doc
多线程笔记
以下是对"C#多线程笔记"中可能包含的知识点的详细解释。 1. **线程基础**: - **什么是线程**:线程是程序执行的最小单元,每个进程至少有一个线程,负责执行程序代码。 - **主线程与子线程**:主线程是程序的...
通过阅读`多线程笔记.doc`和运行`threadDemo`示例代码,你可以对Java多线程有更深入的理解,并能够在实际项目中灵活运用这些知识,解决并发问题。同时,博客地址提供了更多详细内容,可以帮助你进一步探索和实践。
java多线程笔记分享
10.8-10.9马老师多线程笔记synchronized .md
### Python3多线程知识点详解 #### 一、线程基础 **线程状态** 在探讨Python3中的多线程之前,我们首先需要理解线程的基本状态及其转换过程。 - **新建**: 当一个线程被创建后,它最初处于新建状态。 - **就绪**...
本篇笔记将深入探讨C#多线程的基本概念、操作方法以及注意事项。 首先,我们要理解多线程的基本概念。线程是程序执行的最小单位,每个线程都有自己的执行路径和栈空间,但它们共享同一块堆内存。因此,线程间的通信...
### C#多线程知识点详解 #### 一、线程与窗体间的交互 在C#编程中,每个窗体通常都运行在一个独立的线程上。这意味着如果一个应用程序包含多个窗体,那么这些窗体将分别运行在各自的线程之上。当需要实现不同窗体...
Java多线程是Java编程中不可或缺的部分,它允许程序同时执行多个任务,从而提升程序的效率和CPU的利用率。在Java中,线程是程序执行的最小单位,而进程则是资源分配的基本单位。一个进程可以包含一个或多个线程,...
马士兵是一位知名的IT教育专家,他的多线程训练营笔记深入浅出地讲解了这一主题,帮助开发者理解并掌握多线程的精髓。 多线程允许一个程序中有多个执行流同时运行,这样可以提高应用程序的效率和响应性。在Java中,...
在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在开发高效能和响应迅速的应用时。本文档将全面解析多线程的基础知识,从简单到复杂,帮助开发者深入理解并掌握这一核心技术。 一、多线程基础 1.1 线程...
### 数据流和多线程知识点总结 #### 一、数据流概述 数据流(Stream)在计算机编程领域中,指的是数据传输的一种模式。通常用于描述数据的输入与输出过程。在Java语言中,数据流是一种非常重要的机制,主要用于...
Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...