一、概述

  标题很抽象,什么叫更方便?更是相比谁来说的呢?

  原来,我们定义任务,都是实现自Runnable或者Callable接口,但是这样必然需要你将新定义的任务附着给线程,然后再调用线程启动。在不考虑Executor的情况下,你会感觉这么做很呆板,如果直接new一个任务对象,他自己就能启动的话,是不是更好?这就是更方便的线程这个标题的由来。

二、实现

  1.继承自Thread

  因为Thread实现了Runnable接口,所以继承自Thread的类,实现其run方法,其中定义的也就是任务。

  这样做的好处是,可以直接调用父类的start方法,可以实现概述中要实现的效果

public class TaskExtendsThread extends Thread{
private int countDown = 5;
private static int threadCount = 0;
/*
* 可以在它的构造方法里直接调用run方法
*/
public TaskExtendsThread(){
super(Integer.toString(++threadCount));
start();
}
public String toString(){
return "#"+getName()+"("+countDown+").";
}
public void run() {
while(true){
System.out.println(this);
if(--countDown == 0 )
return ;
}
}
public static void main(String[] args){
for(int i = 0 ;i < 5 ;i++)
new TaskExtendsThread();
}
}

  这样,在new一个对象时就会让你的任务自动附着给线程并启动。

  2.自管理的Runnable,实现Runnable接口。例如SelfManagedThread

  既然已经有了Thread类的实现,为什么还要有自管理Runnable呢?这样做和继承Thread没有区别,只是这样做会让你的类更灵活,实现了该类还可以继承其他你想让他继承的类。

public class SelfManagedThread implements Runnable{
private int countDown = 5;
private Thread t = new Thread(this);
/*
* 在构造器中启动线程可能会变得很有问题
* 因为另一个任务可能会在构造器结束之前开始执行,这意味着该任务能够访问处于不稳定状态的对象
*/
public SelfManagedThread(){
t.start();
}
public String toString(){
return Thread.currentThread().getName()+"("+countDown+").";
}
@Override
public void run() {
while(true){
System.out.println(this);
if(--countDown==0)
return;
}
}
public static void main(String[] args){
for(int i = 0; i < 5 ;i++)
new SelfManagedThread();
}
}

三、然并卵

  这个大标题起的很好,因为目前为止,只知道这两种方式,都是在构造器中启动线程的,这可能会变的很有问题,因为另一个任务可能会在构造器结束之前开始执行,这意味着该任务可能访问处于不稳定状态的对象.故:优选Executor而不是显示地创建Thread对象的一个原因

  但是也不能说这样的解决方式完全没有用,待有朋友看到文章后给些提示……

四、线程的术语

  至此,关于线程的实现,大部分总结完了,剩下的就是竞争资源、线程同步等并发方面的问题了。所以,在此总结下线程的术语

术语
   |——线程并不是任务,线程不做任何事情只是驱动附着给它的任务执行
   |——Runnable接口理解:可以理解为该方法的反型封装,即它执行能做的事情
   |——其实任务应该实现一个名为Task的接口,这样更容易理解java中的线程
   |——从概念上讲:我们希望创建独立于其他任务运行的任务,因此我们应该能够定义任务,然后说“开始”,并且不用操心细节。
   |——java的线程机制基于来自c的低级的p线程方式,这事你必须深入研究,并且需要完全理解其所有事务的所有细节的方式,这种低级特性部分地渗入           了java的实现中,因此为了处于更高的抽象级别,在编写代码时,你必须遵循规则
   |——任务:在描述将要执行的工作时使用术语“任务”;在引用到驱动任务的具体机制时,使用属于“线程”

  注:以上代码均来自《Thinking in java》,总结及理解均来自个人,如有错误请大家批评指正。

最新文章

  1. &lt;Interview Problem&gt;二叉树根到叶节点求和值匹配
  2. getElementById,getElementsByName,getElementsByTagName的区别
  3. 成员资格、授权 &ndash; ASP.NET MVC 4 系列
  4. Dapper学习 - Dapper的基本用法(一) - 查询
  5. &amp;nbsp;兼容性问题
  6. 从零开始,CentOS6安装ghost博客
  7. visual 2008中error PRJ0003 : 生成 cmd.exe 时出错
  8. js跨域及解决方案
  9. LaTeX中参考文献管理以及注意事项
  10. Qt编程之Qt样例表(QSS)
  11. HDU 4876 ZCC loves cards _(:зゝ∠)_ 随机输出保平安
  12. java移位运算符具体解释
  13. uva--165(邮资问题,dp)
  14. 谷歌、火狐浏览器下实现JS跨域iframe高度自适应的完美解决方法,跨域调用JS不再是难题!
  15. vue-cli3.0 flexible&amp;px2rem 解决第三方ui组件库样式问题
  16. 关于c++ template的branching和Recursion的一段很好的描述
  17. css 按钮凹陷的感觉
  18. python正则表达式re模块详细介绍--转载
  19. 聊天室(上篇)GatewayWorker 基础
  20. 微信小程序导航设置

热门文章

  1. UI布局
  2. bootstrap-fileinput初体验
  3. 分享web前端七款HTML5 Loading动画特效集锦
  4. android ListView的介绍和优化
  5. poj 3268 Silver Cow Party
  6. windows下 berkerly db的安装配置(修正了关键步骤)
  7. VC和VS系列(2005)编译器对双精度浮点溢出的处理
  8. WP开发笔记——控件倾斜效果
  9. 自适应rem布局
  10. Entity Framework Code First 常用方法集成