1. 线程的基本概念
线程是一个程序内部的顺序控制流。
线程的状态 (创建 / 就绪 / 运行 / 阻塞 / 中止)
线程和进程的区别
Java的线程是通过java.lang.Thread类来实现的。
VM 启动时会有一个由主方法(public static void main() {})所定义的线程。
可以通过创建 Thread 的实例来创建新的线程。
每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
通过调用Thead类的start()方法来启动一个线程。
2. 线程的创建和启动
3. 线程控制基本方法
4. sleep / join / yield 方法
5. 线程模式
两种线程模式:
协作式:一个线程保留对处理器的控制直到它自己决定放弃
速度快、代价低
用户编程非常麻烦
抢先式。系统可以任意的从线程中夺回对CPU的控制权,再把控制权分给其它的线程 。
两次切换之间的时间间隔就叫做时间片
效率不如协作式高 ,OS核心必须负责管理线程
简化编程,而且使程序更加可靠
多数线程的调度是抢先式的。
6. 线程的优先级别
Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。
线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5。
Thread.MIN_PRIORITY = 1
Thread.MAX_PRIORITY = 10
Thread.NORM_PRIORITY = 5
使用下述线方法获得或设置线程对象的优先级。
int getPriority();
void setPriority(int newPriority);
不同平台上的优先级
Solaris:相同优先级的线程不能相互抢占对方的cpu时间。
windows:可以抢占相同甚至更高优先级的线程的cpu时间
7. 线程同步
在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问该对象。
关键字synchronized 来与对象的互斥锁联系。当某个对象synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
通常情况下(不包括调用了wait方法),只有synchronized修饰的代码全执行完,才会释放这把锁。
synchronized可以修饰
修饰非静态的成员方法,或者方法里面的一部分代码
修饰参数
修饰成员变量
修饰static方法,那么锁加到了Test.class上。
修饰类
如果调用没有被synchronized修饰的普通方法,由于不需要得到一把锁。所以肯定不需要排队
实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
定义private 的成员变量,所有访问到关键成员变量的方法都要认真考虑是不是同步。
8. wait sleep 区别
9. Synchronized总结
线程是一个程序内部的顺序控制流。
线程的状态 (创建 / 就绪 / 运行 / 阻塞 / 中止)
线程和进程的区别
引用
每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
线程可以看成时轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
多进程: 在操作系统中能同时运行多个任务(程序)
多线程: 在同一应用程序中有多个顺序流同时执行
线程可以看成时轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
多进程: 在操作系统中能同时运行多个任务(程序)
多线程: 在同一应用程序中有多个顺序流同时执行
Java的线程是通过java.lang.Thread类来实现的。
VM 启动时会有一个由主方法(public static void main() {})所定义的线程。
可以通过创建 Thread 的实例来创建新的线程。
每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
通过调用Thead类的start()方法来启动一个线程。
2. 线程的创建和启动
引用
可以有两种方式创建新的线程。
第一种
定义线程类实现Runnable接口
Thread myThread = new Thead(target)//target为Runnable接口类型。
Runnable中只有一个方法:
public void run(); 用以定义线程运行体。
使用Runnable接口可以为多个线程提供共享的数据。
在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:
public static Thread currentThread() 获取当前线程的引用。
第二种
可以定义一个Thread的子类并重写其run方法如:
class MyThread extends Thead {
public void run(){…}
}
然后生成该类的对象:
MyThread myThread=new MyThead(…)
第一种
定义线程类实现Runnable接口
Thread myThread = new Thead(target)//target为Runnable接口类型。
Runnable中只有一个方法:
public void run(); 用以定义线程运行体。
使用Runnable接口可以为多个线程提供共享的数据。
在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:
public static Thread currentThread() 获取当前线程的引用。
第二种
可以定义一个Thread的子类并重写其run方法如:
class MyThread extends Thead {
public void run(){…}
}
然后生成该类的对象:
MyThread myThread=new MyThead(…)
3. 线程控制基本方法
isAlive() | 判断线程是否还“活”着,即线程是否还未终止。 |
getPriority() | 获得线程的优先级数值 |
setPriority() | 设置线程的优先级数值 |
Thread.sleep() | 将当前线程睡眠指定毫秒数 |
join() | 调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行。 |
yield() | 让出CPU,当前线程进入就绪队列等待调度。 |
wait() | 当前线程进入对象的wait pool。 |
notify()/notifyAll() | 唤醒对象的wait pool中的一个/所有等待线程。 |
4. sleep / join / yield 方法
引用
sleep方法
可以调用Thread的静态方法:
public static void sleep(long millis) throws InterruptedException
使得当前线程休眠(暂时停止执行millis毫秒)。
由于是静态方法,sleep可以由类名直接调用:
Thread.sleep(…)
join方法
合并某个线程
yield方法
让出CPU,给其他线程执行的机会
可以调用Thread的静态方法:
public static void sleep(long millis) throws InterruptedException
使得当前线程休眠(暂时停止执行millis毫秒)。
由于是静态方法,sleep可以由类名直接调用:
Thread.sleep(…)
join方法
合并某个线程
yield方法
让出CPU,给其他线程执行的机会
5. 线程模式
两种线程模式:
协作式:一个线程保留对处理器的控制直到它自己决定放弃
速度快、代价低
用户编程非常麻烦
抢先式。系统可以任意的从线程中夺回对CPU的控制权,再把控制权分给其它的线程 。
两次切换之间的时间间隔就叫做时间片
效率不如协作式高 ,OS核心必须负责管理线程
简化编程,而且使程序更加可靠
多数线程的调度是抢先式的。
6. 线程的优先级别
Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。
线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5。
Thread.MIN_PRIORITY = 1
Thread.MAX_PRIORITY = 10
Thread.NORM_PRIORITY = 5
使用下述线方法获得或设置线程对象的优先级。
int getPriority();
void setPriority(int newPriority);
不同平台上的优先级
Solaris:相同优先级的线程不能相互抢占对方的cpu时间。
windows:可以抢占相同甚至更高优先级的线程的cpu时间
7. 线程同步
在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问该对象。
关键字synchronized 来与对象的互斥锁联系。当某个对象synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
通常情况下(不包括调用了wait方法),只有synchronized修饰的代码全执行完,才会释放这把锁。
synchronized可以修饰
修饰非静态的成员方法,或者方法里面的一部分代码
修饰参数
修饰成员变量
修饰static方法,那么锁加到了Test.class上。
修饰类
如果调用没有被synchronized修饰的普通方法,由于不需要得到一把锁。所以肯定不需要排队
实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
定义private 的成员变量,所有访问到关键成员变量的方法都要认真考虑是不是同步。
public class Test implements Runnable { Timer timer = new Timer(); public static void main(String[] args) { Test test = new Test(); Thread t1 = new Thread(test); Thread t2 = new Thread(test); t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } public void run(){ timer.add(Thread.currentThread().getName()); } } class Timer{ private static int num = 0; public void add(String name){ num ++; try {Thread.sleep(1);} catch (InterruptedException e) {} System.out.println(name+", 你是第"+num+"个使用timer的线程"); } }
8. wait sleep 区别
引用
来源不同
Sleep是Thread提供的方法
Wait继承自Object
代码位置不同
Wait需要写在Synchronize语句块里面
是否释放锁定对象
调用wait方法,释放锁定该对象
Sleep时别的线程也不可以访问锁定对象
Sleep是Thread提供的方法
Wait继承自Object
代码位置不同
Wait需要写在Synchronize语句块里面
是否释放锁定对象
调用wait方法,释放锁定该对象
Sleep时别的线程也不可以访问锁定对象
9. Synchronized总结
引用
无论synchronized关键字加在方法上还是对象上,它取得的锁都是锁在了对象上,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
每个对象只有一个锁(lock)与之相关联。
实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。
还有一些技巧可以让我们对共享资源的同步访问更加安全:
定义private 的instance变量+它的 get方法,而不要定义public/protected的instance变量。如果将变量定义为public,对象在外界可以绕过同步方法的控制而直接取得它,并改动它。
如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。 这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。
每个对象只有一个锁(lock)与之相关联。
实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。
还有一些技巧可以让我们对共享资源的同步访问更加安全:
定义private 的instance变量+它的 get方法,而不要定义public/protected的instance变量。如果将变量定义为public,对象在外界可以绕过同步方法的控制而直接取得它,并改动它。
如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。 这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。
发表评论
-
十一、GUI编程
2010-03-28 11:57 9861. GUI -- Graphical User Interf ... -
十、网络编程(TCP/IP、Socket编程、C/S)
2010-03-28 11:16 17041. 网络基础概念 ... -
八、流
2010-03-20 20:38 9051. Java流式输入/输出原理:在Java程序中,对于数据的 ... -
七、容器/集合
2010-03-20 18:00 9611. 容器概念:Java API 所提供的一系列类的实例,用于 ... -
六、常用类
2010-03-19 20:20 6601. String 类 java.lang.String 类代 ... -
五、数组
2010-03-18 20:20 8841. 数组概述 数组 ... -
四、异常处理
2010-03-17 22:30 7041. 异常的概念 Java 异常是Java提供的用于处 ... -
三、面向对象
2010-03-17 15:47 8871. 面向对象编程语言特 ... -
二、基础语法
2010-03-17 13:21 6661. 标识符命名规则:由字母、“_”、“$”或数字组成,并以字 ... -
一、Java入门
2010-03-17 12:37 7151. java的核心机制:虚拟机、垃圾收集。 2. JVM ...
相关推荐
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
Java的多线程机制是Java语言的一大特性,它允许程序同时执行多个任务,提升程序响应速度,优化资源利用率。在Java中,线程是程序执行的最小单位,一个进程可以包含多个线程,每个线程都有自己独立的生命周期,包括...
Java多线程机制研究.kdh Java多线程机制研究.kdh Java多线程机制研究.kdh
### Java多线程机制详解与示例 #### 一、Java多线程机制概述 Java中的多线程机制是程序设计中的一个重要概念,它允许在同一个应用程序中并发执行多个线程,有效地提高了程序的执行效率和响应速度。通过Java语言...
JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。这些题目涵盖了 JAVA 多线程编程的基本概念和技术,包括线程的生命周期、线程同步、线程状态、线程优先级、线程安全等...
当用户在“命令”后的文本框中输入“start clock”后,“现在的时间是”后的文本框开始显示系统时钟;当用户输入“stop clock”后,时钟终止显示。 (2)当用户在“命令”后的文本框中输入“fast”后,能够加速滚动...
本文将深入探讨Java多线程机制,包括线程的创建、同步、通信以及常见设计模式。 首先,Java中创建线程主要有两种方式:通过实现Runnable接口和继承Thread类。实现Runnable接口更灵活,因为Java是单继承的,而通过...
Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。...在实际开发中,正确地应用多线程机制可以显著提升程序的性能和用户体验。
"Java多线程机制分析与应用" Java多线程机制是Java语言中一个重要的特征,可以通过对Java中的多线程创建机制和使用方法进行探讨,分析多线程中的同步必要性和实现方式,并给出多线程的实际应用示例。 Java多线程...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
Java多线程机制是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。本文...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...
本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
### 基于Java多线程机制的探析 #### 摘要 本文深入探讨了Java多线程机制的基本原理及其应用场景。首先简要分析了Java多线程的概念及其实现方法,随后详细介绍了多线程在多用户远程协同工作系统中的应用,特别是...
"Java多线程机制探讨" Java多线程机制是指在Java语言中实现多线程编程的机制。多线程机制允许多个线程同时执行,提高了程序的效率和响应速度。Java多线程机制可以通过Thread类或Runnable接口实现。 Thread类是Java...
### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...
"Java多线程机制详解" Java多线程机制是Java语言中的一种重要机制,能够提高程序的执行效率。本文将介绍Java语言中多线程的两种实现方式,并分别举例说明了各自的特点、格式以及运行结果。 第一种实现方式是实现...
《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...