本文由 ImportNew - liken 翻译自 Journaldev
 
Java线程是执行某些任务的轻量级进程。Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程。 应用中有两类线程——用户线程和守护线程。当启动应用时,main线程是创建的第一个用户线程,我们可以创建多个用户线程和守护线程。当所有用户进程执行完毕时,JVM终止程序。 可以对不同的线程设置不同的属性,但并不保证高优先级的线程在低优先级线程之前执行。线程调度器是操作系统的部分实现,当一个线程启动后,它的执行被线程调度器控制,JVM不会控制它的执行。 可通过扩展Thread类实现的Runnable接口创建线程。
1
2
3
4
5
Thread t = new Thread(new Runnable(){
    @Override
    public void run() {
    }
});

以上用几行代码就创建了新线程,在此,作为匿名类创建的Runnable接口,请阅读这篇文章学习内部类,嵌套类和匿名内部类。 几周之前,针对线程我已经发表了几篇有用的文章,你可以一步一步按照如下顺序学习Java中的线程。

  1. Java线程实例

    这是线程教程系列的第一篇文章,阅读它来了解进程和线程。 线程和进程之间的区别是什么,使用线程的优势和如何使用Runnable接口和Thread类创建线程。 该文还比较了Runnable接口和Thread类。

  2. Java线程休眠(Thread sleep)

    Java线程休眠 用于暂停当前执行的线程, 在将来的文章中,我们将广泛的使用线程休眠,因此最好了解它是如何工作的以及是否准确?

  3. Java线程的加入(Thread Join)

    有时我们需要等待其他线程结束后再继续执行,我们可以使用线程的加入来实现,本文将学习线程的加入是如何工作的以及何时使用它。

  4. Java线程状态(Thread States)

    理解线程的不同状态是重要的,本文将学习线程如何改变他的状态以及线程调度器如何改变线程的状态。

  5. Java 线程的wait, notify 和 notifyAll

    Java Object类包含三个方法,使用这三个方法,线程可以交流对于一个资源的锁状态,通过简单地Waiter-Notifier实现学习如何使用这些方法。

  6. Java线程安全于同步(Thread Safety and Synchronization)

    我们知道线程共享对象资源,但这将导致数据损坏,因为它们都不是原子操作。本文将学习使用不同方法实现Java的线程安全,学习正确使用synchronization操作符,synchronized方法和synchronized块。本文还有很多使用synchronized实例并讲解使用它们带来的问题。

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

    JVM使用main方法创建第一个线程,本文介绍日常遇到的通用异常和产生这些异常的根本原因以及如何解决它们。

  8. 单例类中的线程安全(Thread Safety in Singleton Class)

    本文将学习创建单例类的基本概念,什么是线程安全问题与他们如何能够做到在单例类的线程安全。

  9. Java守护线程(Daemon Thread)

    本文解释了守护进程和如何在Java中创建守护线程。

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

    我们知道线程共享对象的变量,但如何得到类级别的线程局部变量呢?Java提供了ThreadLocal实用类来创建线程局部变量,在这篇文章中学习如何在Java程序中创建ThreadLocal变量。

  11. Java线程转储(Thread Dump)

    Java线程转储提供程序的当前线程信息,这个信息对分析应用的性能问题或者查找解决死锁情况很有帮助,这篇文章阐明了Java中用于产生线程转储的不同方法。

  12. 如何分析和避免Java中的死锁(How to Analyze Deadlock and avoid it in Java)

    死锁是多线程等待彼此释放资源造成的循环依赖的情况。本文讨论了如何在Java程序中制造死锁,如何使用线程转储分析死锁以及避免Java程序死锁的最佳实践。

  13. Java计时器线程(Timer Thread)

    本文阐述了如何使用Java的Timer和TimerTask类来创建以固定时间间隔运行的任务。使用一个例子展现如何使用和取消计时器。

  14. Java生产者与消费者问题(Producer Consumer Problem)

    Java 5之前,生产者-消费者问题可以使用wait()和notify()方法解决,但BlockingQueue的引入更加简化了这个问题。通过本文我们学习Java中如何使用BlockingQueue来解决生产者-消费者问题。

  15. Java线程池(Thread Pool)

    Java线程池是等待处理任务的工作线程的集合,Java5中引入的Executor框架使得它很容易在java中使用Executors和的ThreadPoolExecutor类创建线程池,本文学习如何使用它们来在Java中创建线程池。

  16. Java回调属性(Callable Future)

    有时我们希望线程可以返回可用的变量,Java5的Callable就可用于这种情况,类似Runnable接口,我们可以使用Executor框架之星这些任务。

  17. Java FutureTask实例(FutureTask Example)

    FutureTask类是实现Future接口的基础类。 使用带Callable的实现和Executors的FutureTask进行异步处理。 FutureTask提供的实施方法来检查任务的状态,一旦执行结束,立刻将值返回给调用程序。覆写某些Future接口的实现方法是非常方便的。

该系列将随着更多线程教程文章的发表而持续增加,所以请保存为书签,以备将来需要。 请让通知我们是否遗漏了你想学习的指示。

原文链接: Journaldev 翻译: ImportNew.comliken
译文链接: http://www.importnew.com/9994.html

Java线程与多线程教程的更多相关文章

  1. Java的线程和多线程教程

    Java线程(Java Thread)是执行某些任务的一种轻量级进程.Java中的Thread类提供了多线程(multi-threading)功能,应用程序能够创建多个线程并同一时候执行. 在一个应用 ...

  2. Java线程和多线程(十三)——Callable,Future,FutureTask

    在Java多线程之中,Callable和Future的使用时非常广泛的.在之前的文章中,我们了解了关于Java线程池基础的一些内容,知道如何提交Runnable的任务.但是,Runnable的任务是无 ...

  3. Java线程和多线程(十二)——线程池基础

    Java 线程池管理多个工作线程,其中包含了一个队列,包含着所有等待被执行的任务.开发者可以通过使用ThreadPoolExecutor来在Java中创建线程池. 线程池是Java中多线程的一个重要概 ...

  4. Java线程和多线程(三)——线程安全和同步

    线程安全在Java中是一个很重要的课题.Java提供的多线程环境支持使用Java线程.我们都知道多线程共享一些对象实例的话,可能会在读取和更新共享数据的事后产生数据不一致问题. 线程安全 之所以会产生 ...

  5. Java线程和多线程(一)——线程的基本概念

    Java 线程是一个轻量级执行任务的处理单元.Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务. 在应用中存在两种类型的线程,用户线程和守护线程.当我们启动应 ...

  6. Java 线程与多线程

    Java是一门支持多线程的编程语言! 什么是进程? 计算机中内存.处理器.IO等资源操作都要为进程进行服务. 一个进程上可以创建多个线程,线程比进程更快的处理单元,而且所占用的资源也小,多线程的应用也 ...

  7. Java并发与多线程教程(3)

    Java中的锁 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂.因为锁(以及其它更高级的线程同步机制)是由synchronized同步 ...

  8. Java并发与多线程教程(2)

    Java同步块 Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) ...

  9. Java并发与多线程教程(1)

    Java并发性与多线程介绍 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是多个任务 ...

随机推荐

  1. 我的android学习经历21

    怎样在代码文件中修改控件的高低 有些时候使用setHight()或者setWidth()不管用就需要使用别的方法,下面有一种方法 你使用的布局.LayoutParams lp = new 你使用的布局 ...

  2. UVA 1351 十三 String Compression

    String Compression Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...

  3. UVA 10564 十 Paths through the Hourglass

     Paths through the Hourglass Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & % ...

  4. 【翻译】Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)

    [翻译]Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解) . . .

  5. ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'mysql'

    mysql> use mysqlERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'mysql' ...

  6. GenericServlet,HttpServletRequest和HttpServletResponse

    最基本的是通过实现Servlet接口来编写Servlet类,这需要实现Servlet接口中定义的5个方法. 为了简化Servlet的编写,在javax.servlet包中提供了一个抽象类Generic ...

  7. FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)

    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术) Time Limit: 1000MS   Memory Limit: 257792K [Description ...

  8. 3----lua的数据转换及运算符

    lua的基本数据类型转换 转换成字符串 tostring( ... ) 可以将布尔类型和数字类型的值转换为字符串类型的值 local num=1; print(type(num)) newNum = ...

  9. AS3 求两条直线的交点

    //粘贴到帧上运行即可 var p1Start:Point = new Point(0,0); var p1End:Point = new Point(50,50); var p2Start:Poin ...

  10. 一个封装较好的删除方法(Delete)

    前台的引用 @Html.ActionLink(“删除字样”,“后台的删除方法”,new{绑定id},new{@style="样式"});方法,如何要独立使用的话,一般还要使用到相应 ...