`

Java基础恶补——线程

    博客分类:
  • Java
 
阅读更多

[SCJP Sun Certified Programmer for Java 6 Study Guide (Exam 310-065)]  chapter9

 

一. 定义、实例化、启动线程
1. 线程可以通过继承 Thread 类并 overriding 方法 public void run().

2. 线程对象可以通过调用带1个Runnable参数的构造函数创建,The Runnable object is said to be the target of
the thread.

3. 1个线程对象的 start() 只能被调用1次,再次调用时将抛出 RuntimeException.

4. 用同1个 Runnable 作为目标创建多个线程对象是合法的。

5. 当1个线程对象创建后,并没有被执行,直到 start() 被调用。当1个线程对象已存在但未被启动时,它处于 new 状态,并且它不会被认为是 alive.

 

二. 线程状态转换
1. 当1个 new 线程已启动,则进入 runnable 状态。

2. 线程scheduler可以使线程在 runnable 和 running 状态间转换。

3. 对1个典型的单处理器机,同1时间只能运行1个线程,尽管有很多线程处于 runnable 状态。

4. 线程启动的顺序是否决定线程运行的顺序是无法确定的。(线程运行的顺序并不一定取决于线程启动的顺序。)

5. 线程是否能得到公平地轮流运行是无法确定的,这由线程scheduler决定,并取决于虚拟机实现。If you want a guarantee that your threads will take turns regardless of the underlying JVM, you can use the sleep() method. This prevents one thread from hogging the running process while another thread starves(这将给其它线程以运行的机会)。(In most cases, though, yield() works well enough to encourage your threads to play together nicely.) 

6. 1个 running 线程可以通过调用其wait(), sleep(), join() 方法,而进入 blocked/waiting 状态。

7. 1个 running 线程可能会因为它不具备同步块的锁,而进入 blocked/waiting 状态。

8. 当 sleep 或 wait 已经结束,或1个对象的锁已经获得,线程只能重新进入 runnable 状态。It will go directly from waiting to running (well, for all practical purposes anyway).

9. 1个 dead 线程不能被再次启动。

 

三. Sleep, Yield, and Join
1. Sleeping 用于延迟执行一段时间,但不会释放锁。

2. 1个 sleeping 线程确定会 sleep一段时间(unless it's interrupted), 但当它醒来时是否会进入 running 状态是无法确定的。

3. sleep() 方法是静态的,sleep 的是当前正在执行的线程,1个线程不能让另1个线程 sleep.

4. setPriority() 方法用于设置线程优先级,从1(低)到10(高),尽管优先级是不确定的,并且不是所有 JVMs 都能识别10个级别,一些级别可能会被当做是相等的。

5. 如果没有明确地设定优先级,1个线程可能和创建它的线程具有同等的优先级。

6. yield() 方法可以引起1个 running 线程退出,当存在着具有同等优先级的 runnable 线程。但这是否会发生是无法确定的,也无法确定是否会有另1个线程被选中运行。1个线程可能 yield 后立即回到 running 状态。

7. 相对来说,比较能够确定的是,任何时刻,1个 running 线程的优先级通常不会比任何其它 runnable 线程低。如果1个较低优先级的线程 running,而1个较高优先级的线程 runnable, JVM 通常会让高优先级的线程取代低优先级的线程运行。

8. 当1个线程调用另1个线程的 join() 方法,则当前 running 线程将等待直到它 joins 的线程完成。join() 方法相当于说:"Hey thread, I want to join on to the end of you. Let me know when you're done, so I can enter the runnable state."

 

四. 并发访问问题和线程同步
1. synchronized 方法防止多个线程同时访问1个对象的临界方法代码。

2. 可以将 synchronized 用于方法或方法块。

3. synchronized 方法块时,必须指定1个argument that is the object whose lock you want to synchronize on.

4. 虽然1个实例的 synchronized 代码只能被1个线程访问,多个线程仍然能访问该实例对象的 unsynchronized 代码。

5. 当1个线程 sleep, 其它线程仍无法得到它占有的锁。

6. 静态方法也可以是 synchronized, using the lock from the java.lang.Class instance representing that class.

 

五. 对象间通过Waiting 和 Notifying 通信
1. wait() 方法相当于说:"there's nothing for me to do now, so put me in your waiting pool and notify me when something happens that I care about." 调用 wait() 方法等同于 "wait me in your pool," or "add me to your waiting list."

2. notify() 方法用于发出1个信号给1个且只有1个处于该对象的等待池中的线程。

3. notify() 方法不能指定通知哪一个等待的线程。

4. notifyAll() 方法和 notify() 方法的工作方法是相同的,唯一不同的是它给处于该对象的等待池中的所有线程都发出信号。

5. wait(), notify(), notifyAll() 必须被在 synchronized 环境中被调用。1个线程要调用1个特定对象的 wait() 或 notify() 方法,必须具有该对象的锁。

 

六. 线程死锁
1. Deadlocking is when thread execution grinds to a halt because the code is waiting for locks to be removed from objects.

2. 当2个对象互相等待对方的锁时,就会发生死锁。

3. Deadlocking is bad. Don't do it.

 

 

关键线程方法(斜体表示该方法是静态的)

Class Object Class Thread Interface Runnable
wait() start() run()
notify() yield()
notifyAll() sleep()
join()

 

 

yield(),sleep()和wait()的区别

 

分享到:
评论

相关推荐

    java常用的代码——线程

    ### Java中的线程基础 #### 1. 什么是线程? 在计算机科学中,线程是指进程中的一个执行单元,它是进程内部的基本调度单位。与进程相比,线程是轻量级的进程,因为它复用了进程的资源(如内存空间),因此创建和...

    java基础——————试题库

    这份“java基础——————试题库”资源旨在帮助学习者系统地复习和深入理解Java的基础知识,确保他们能够全方位地掌握这一强大的编程工具。下面将详细阐述Java的基础知识点。 1. **Java简介** - Java是由Sun ...

    Java 语法总结——线程(线程)

    Java线程是多任务编程的重要组成部分,它允许程序同时执行多个独立的代码片段。在Java中,线程有两种创建方式:通过实现Runnable接口或者继承Thread类。本文将深入探讨Java中的线程概念、创建方法、状态管理以及同步...

    深入体验Java Web开发内幕——核心基础

    本主题将深入探讨Java Web开发的核心基础知识,帮助你全面理解这一技术的内在机制。 一、Java Web 开发概述 Java Web开发是利用Java语言进行网络应用设计的技术体系,主要由Servlet、JSP(JavaServer Pages)、JSTL...

    Java面试之——线程编程方面

    Java线程编程是Java开发中的重要组成部分,尤其在面试中,这部分知识的掌握程度往往成为衡量开发者...这些知识点涵盖了Java面试中线程编程部分的基础和进阶问题,理解并熟练掌握这些内容对于面试和实际开发都至关重要。

    Java多线程——线程八锁案例分析.docx

    在Java多线程编程中,线程安全是一个关键概念,特别是在并发访问共享资源时。"线程八锁案例分析"文档中的示例着重展示了`synchronized`关键字如何在控制线程同步方面发挥作用。以下是对这些案例的详细分析: 案例1...

    java多线程案例——未完成

    下面是对Java多线程基础知识的详细解释: 1. **线程的创建方式**: - 继承`Thread`类:自定义一个新的类,继承Java的`Thread`类,并重写`run()`方法。创建实例后调用`start()`方法启动线程。 - 实现`Runnable`...

    《Java语言程序设计——基础篇》第三章选择作业答案.zip

    《Java语言程序设计——基础篇》是Java语言的经典教材,中文版分为《Java语言程序设计基础篇》和《Java语言程序设计进阶篇》主要介绍语法结构、面向对象程序设计基础知识到面向对象程序设计、图形用户界面设计、异常...

    java编程——Java线程

    ### Java线程详解 #### 线程概念与重要性 Java线程是Java编程语言中用于实现并发处理的关键机制之一。线程是程序执行流的最小单位,它允许一个程序在同一时间执行多个任务,从而提高了程序的效率和资源利用率。在...

    java高级编程——多线程,输入输出流,网络编程

    java高级编程——对多线程,输入输出流,网络编程这三大块的深入讲解。

    java上机报告5——Java的多线程编程1

    Java 多线程编程应用场景 —— 电影院售票系统设计 本资源摘要信息将对 Java 多线程编程在电影院售票系统设计中的应用进行详细介绍。该系统模拟了电影院三个售票窗口同时出售电影票的过程,通过 Java 多线程编程...

    Java面试之——线程编程方面[借鉴].pdf

    Java线程编程是Java开发中的重要组成部分,尤其在...这些知识点涵盖了Java线程编程的基础和高级概念,对于理解和解决并发问题至关重要。在实际开发中,理解并熟练掌握这些内容能帮助开发者编写高效、安全的多线程代码。

    JAVA面试题——多线程.docx

    ### JAVA面试题——多线程知识点详解 #### 一、线程与进程的基本概念 线程和进程是并发编程中的两个基本概念。进程是操作系统进行资源分配和调度的基本单位,而线程则是进程中的实际运行单元。每一个进程都有其...

    尚硅谷Java基础实战——Bank项目下载地址

    【Java基础实战——Bank项目详解】 Java作为一款广泛使用的编程语言,其强大的功能和灵活性使其在软件开发领域占据着重要地位。"尚硅谷Java基础实战——Bank项目"是一个旨在帮助初学者深入理解Java编程概念并实践...

    《Java语言程序设计——基础篇》第一章计算机、程序和Java概述作业答案.zip

    《Java语言程序设计——基础篇》是Java语言的经典教材,中文版分为《Java语言程序设计基础篇》和《Java语言程序设计进阶篇》主要介绍语法结构、面向对象程序设计基础知识到面向对象程序设计、图形用户界面设计、异常...

    《Java语言程序设计——基础篇》第三章选择示例.zip

    《Java语言程序设计——基础篇》是Java语言的经典教材,中文版分为《Java语言程序设计基础篇》和《Java语言程序设计进阶篇》主要介绍语法结构、面向对象程序设计基础知识到面向对象程序设计、图形用户界面设计、异常...

    《Java语言程序设计——基础篇》第五章方法示例.zip

    《Java语言程序设计——基础篇》是Java语言的经典教材,中文版分为《Java语言程序设计基础篇》和《Java语言程序设计进阶篇》主要介绍语法结构、面向对象程序设计基础知识到面向对象程序设计、图形用户界面设计、异常...

    《Java语言程序设计——基础篇》第四章循环示例.zip

    《Java语言程序设计——基础篇》是Java语言的经典教材,中文版分为《Java语言程序设计基础篇》和《Java语言程序设计进阶篇》主要介绍语法结构、面向对象程序设计基础知识到面向对象程序设计、图形用户界面设计、异常...

    JAVA项目——多线程下载代码

    本项目以"JAVA项目——多线程下载代码"为主题,使用Eclipse集成开发环境进行实现,适合于Java初学者或毕业设计实践。下面我们将深入探讨相关的Java多线程下载知识点。 1. **线程基础**:在Java中,线程是程序执行的...

Global site tag (gtag.js) - Google Analytics