一、概述

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

  原来,我们定义任务,都是实现自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》,总结及理解均来自个人,如有错误请大家批评指正。

Java多线程——<六>更方便的线程的更多相关文章

  1. Java多线程学习(八)线程池与Executor 框架

    目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...

  2. “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. Java多线程基础:进程和线程之由来

    转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...

  4. Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会有解决很多问题]生产者消费者模型

    http://blog.csdn.net/a352193394/article/details/39503857  Java多线程之~~~使用Exchanger在线程之间交换数据[这个结合多线程并行会 ...

  5. Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier

    Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ...

  6. “全栈2019”Java多线程第十三章:线程组ThreadGroup详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. “全栈2019”Java多线程第十一章:线程优先级详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. “全栈2019”Java多线程第九章:判断线程是否存活isAlive()详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. 1、Java多线程基础:进程和线程之由来

    Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...

随机推荐

  1. 常用的CSS缩写语法一些方法小结

    使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.css缩写的主要规则如下: 颜色 16进制的色彩值,如果每两位的值相同,可以缩写一半,例如: #000000可以缩写为#000;#336699可以 ...

  2. dataset 和DataTable的用法

    以下包含了这两种不同属性的用法: foreach (DataRow dr in dataset.Tables[0].Rows)            { if (i != 0 && l ...

  3. Android开发之切换activity动画overridePendingTransition

    原文地址:http://blog.sina.com.cn/s/blog_706c449f01011s3v.html overridePendingTransition 在startActivity() ...

  4. JQuery Pagination 分页插件 增加了首页尾页以及跳转功能

    JQuery分页插件 挺好用的 但是官方是没有提供首页尾页以及跳转功能 我觉得这个功能可以有,于是就改进了一下 一个js一个css从连接里面下 链接:http://pan.baidu.com/s/1n ...

  5. 10 个非常有用的 AngularJS 框架

    AngularJS是最流行的开源web app框架.AngularJS被用于解决阻碍单页应用程序开发的各种挑战. 你作为一个AngularJS用户,却不知道一些可以帮助你美化编码的资源?那么一定不能错 ...

  6. 数值积分NIntegrate中的具体算法

    数值积分方法很多,Mathematica中至提供了NIntegrate.具体算法可参照官方帮助. http://reference.wolfram.com/language/tutorial/NInt ...

  7. 济南学习 Day1 T1 am

    题意:给你两个日期,问这两个日期差了多少毫秒 #include<cstdio> #include<cstring> #include<ctime> #include ...

  8. POJ 1273(EK)

    题目大概意思是,有N条水沟和M个水池,问从第一个水池到最后一个水池在同一时间内能够流过多少水第一行有两个整数N,M接下来N行,每行有3个整数,a,b,c,代表从a到b能够流c单位的水超级模板题,一个有 ...

  9. c# 取得ip地址和网关

    /// <summary> /// 得到本机IP /// </summary> private string GetLocalIP() { //本机IP地址 string st ...

  10. C#主要支持 5 种动态创建对象的方式

    C#主要支持 5 种动态创建对象的方式: 1. Type.InvokeMember 2. ContructorInfo.Invoke 3. Activator.CreateInstance(Type) ...