首页 > 开发 > JAVA > 正文

java线程的问题

2017-09-07 09:24:22  来源:网友分享

最近看到一篇关于Java线程的文章,里面有说使用集成Thread 还是 实现Runable接口

对于这两种方式哪种好并没有一个确定的答案,它们都能满足要求。就我个人意见,我更倾向于实现Runnable接口这种方法。因为线程池可以有效的管理实现了Runnable接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止。而如果线程是通过实现Thread子类实现的,这将会复杂一些。

底下有人评论说

实现了Runnable接口,不是线程,应该称为任务,线程池只接受任务,线程池怎么还可以接受线程呢?求解

大家怎么看上面说的

解决方案

首先得理解什么是Thread?

A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution running concurrently.

这是java.lang.Thread类的javadoc的部分引用,废话地翻译一下,Thread只是程序中一个执行序,JVM在允许程序中同时存在多个执行序并发执行。Thread其实就是JVM对操作系统线程的一个抽象。

其次得理解什么是Runnable?

This interface is designed to provide a common protocol for objects that wish to execute code while they are active.

这是java.lang.Runnable类的javadoc的部分引用。废话地翻译一下,这个接口提供一种通用的协议,那些需要在特定的活动时刻执行某些特定代码的对象都必须遵守这个协议—— 实现run方法

再次,说说Java使用多线程的几个主要方式:

  1. 继承Thread类,实现run方法;
  2. 实现Runnable接口,再绑定到Thread类;
  3. 通过Java5提供Executor框架(也要实现Runnable接口);

这3种方式,最终执行都要落实到Thread,因为Thread是JVM对操作系统线程的一个抽象,只有它才有被操作系统调度,获得CPU执行时间片的能力。

最后说说Thread与Runnable的不同:

  • Thread是JVM对操作系统线程的抽象,是一个底层抽象,它抽象了线程如何执行的细节;Runnable是对执行任务的抽象,是一个高层抽象,它抽象了线程执行什么(执行目标)的细节,个人觉得其实Runnable改成Task更贴切些;

PS:要想好好地理解这二者的异同,建议仔细读读Thread和Runnable的javadoc。