您的位置:首页 > 编程语言 > Java开发

Java的线程和多线程教程

2014-05-21 01:16 288 查看
Java线程(Java Thread)是执行某些任务的一种轻量级进程。Java中的Thread类提供了多线程(multi-threading)功能,应用程序可以创建多个线程并同时运行。

在一个应用程序中,通常会有两种类型的线程-用户线程(user thread)守护线程(daemon thread)。当我们启动引用程序时,首先创建用户线程main,我们可以创建多个用户线程和守护线程。当所有的用户线程都执行完毕时,JVM就会终止程序。

对不同的线程,我们可以设置相应的优先级,但并不意味着高优先级线程会先于低优先级线程执行。线程的调度是由操作系统来完成的,每当线程启动后,线程的执行是由线程调度程序来控制的,而非JVM。

我们可以通过两种方式来创建线程:实现Runnable接口,或者,继承Thread类。

Thread t = new Thread(new Runnable() {
@Override
public void run() {
}
});
以上代码创建了一个新的线程,其中,我们将Runnable作为匿名类来实现,可以阅读文章《Java Nested Classes
- java inner class, static nested class, local inner class and anonymous inner class》来了解内部类、嵌套类和匿名内部类。

在最近的几周,我已就线程发表了几篇干货,通过阅读这些文章,你会对Java中的线程有所了解。



1. Java线程示例译文

这是线程教程系列文章中的第一篇,阅读该文可以了解进程(Process)线程(Thread),进程和线程的区别,使用线程的好处,以及,如何通过Runnable接口和Thread类来创建线程。

该文中还对Runnable接口和Thread类进行了比较。

2.
Java线程的休眠(Sleep译文

Java线程的休眠是用于暂停当前线程的执行,在后续的文章中将会大量应用到线程休眠,所以我们最好了解它的工作机制以及是否准确。

3.
Java线程的加入(Join) 【译文

有时,我们需要等待其他线程结束运行后才能执行任务,这种情况下,我们可以使用Thread-join方法,该文将介绍Thread-join方法的工作机制和应用场景。

4.
Java线程的状态(States)

了解线程不同的状态是十分重要的,我们需要知道线程如何改变自己的状态,以及线程调度程序如何改变线程的状态。

5.
Java线程的wait、notify和notifyAll方法

Java的Object类中包含三个方法wait、notify和notifyAll,线程可以通过调用这三个方法来沟通资源的锁定状态,我们可以通过一个简单的等待者-通知者(Waiter-Notifier)的示例来学习三个方法的使用。

6.
Java线程的安全与同步(Synchronization)

我们知道,线程共享对象资源,由于这些操作不具有原子性,有可能会导致数据损坏。通过该文,我们将学到如何在Java中调用不同方法时实现线程安全,以及同步(synchronization)、同步方法和同步锁的正确用法。

7.
Java主线程(main)中的异常

JVM使用main方法创建第一个线程,该文将介绍日常工作中常见的一些异常,这些异常出现的根本原因,以及解决方案。

8.
单例(Singleton)类的线程安全

在这片文章中,你将会学到有关创建单例类的最基本概念,单例类可能会出现的线程安全问题,以及如何在单例类中实现线程安全。

9.
Java的守护线程(Daemon Thread)

该文简单地介绍了守护线程,以及如何在Java中创建守护线程。

10.
Java的线程本地变量(Thread Local)

我们都知道,线程共享类的变量,如果我们想要获取在类层次创建的线程本地(thread-local)变量,该怎么办。Java提供了ThreadLocal公用类来创建线程本地变量。该文介绍如何再Java程序中创建线程本地变量。

11.
Java中的线程转储(Thread Dump)

Java线程转储为程序提供了当前线程的信息,该信息有助于分析应用程序的性能和解决死锁问题。该文介绍了Java中能用于实现线程转储的各种方法。

12.
在Java中如何分析并避免死锁

多个线程相互间等待其他线程释放资源,由此导致循环依赖,这样的情况就叫做死锁。该文谈论了Java程序中出现死锁的情况,如何使用线程转储来发现死锁,以及在实践中避免Java程序死锁的最佳方法。

13.
Java的定时器线程(Timer Thread)

本文介绍如何使用Java定时器(Java Timer)和TimerTask类来创建定时执行的任务,并提供示例程序来演示如何使用和取消定时器。

14.
Java中的生产者(Producer)-消费者(Customer)问题

在Java5之前,可以使用wait()和notify()方法来解决生产证-消费者问题,而BlockingQueue的引入提供了一种更为建档的方法。该文介绍在Java中如何使用BlockingQueue来解决生产者和消费者问题。

15.
Java线程池(Thread Pool)

Java线程池是等待处理工作的线程集合,根据Java5中关于Executor框架的介绍,我们很容易就可以用Executors和ThreadPoolExecutor类来创建线程池,该文就介绍如何用它们来创建Java线程池。

16.
Java的Callable接口和Future接口

我们有时会希望线程提供返回值,Java5中的Callable接口就适用于这种情况,它和Runnable接口相似,我们可以使用Executor框架来执行这些任务。

17.
Java的FutureTask示例

FutureTask是实现Future接口的基础实体类。我们通常将它与Callable实现和Executor结合应用于异步处理。FutureTask提供实现方法来检查任务的状态,并在任务结束时将值返回给调用程序。重写Future接口的实现方法是很容易的。

该文章列表将会更新更多关于线程的文章,请将本文存入书签以备后用。

如果本文中缺少您想要了解的内容,请告知我们。

原文地址:Java Thread and Multithreading Tutorial
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: