java并发编程(一)

线程基础

在Java代码中,单独创建线程,都需要使用类java.lang.Thread,通常可以通过集成并扩展Thread的run()方法,也可以来创建一个Thread,将一个Runnable任务实体当做参数传入,这是通过线程来执行任务的过程,但并不能说实现了Runnable接口就是一个线程。

Runnable接口,就是“可以被执行”的意思。例如:Closeable。它只能代表“可以被关闭”,Closeable接口中描述中提供了一个close()方法要求子类实现。

一个线程的启动需要Thread通过Thread.start()方法来完成,这个方法需要调用本地方法(JNI)来实现真正意义上得线程,或者说只有start()成功调用后由OS分配线程资源,才能叫做线程,而在JVM中分配的Thread对象只是与之对应的的外壳。

Runbable既然不是线程,有什么用呢?

如何区分继承Thread实现start()来完成线程的实现与实现Runnable接口的run()方法,放入Thread调用start()方法进行执行。

可以将Runnable看成一个“任务”,在与Thread配合使用,即在创建线程的时候将Runnable的实例化对象作为参数传入。此时,Runnable的实例化对象将被设置到Thread所在对象中的一个名为“traget”的属性上,Thread默认的run()方法是调用这个target的run()方法来完成的,这样的Runnable的概念就和线程区分开来。Runnable本身是任务,线程可以执行任务

Thread需要通过子类去实现run()方法来描述任务的内容。

同时,一个Thread可以尝试获取多个Runnable任务,每次获取之后进行执行run()方法。这样就能明确区分Thread和Runnable不是一个概念。

这段代码只为了让初学者了解到线程的存在。
/**
* @author cc
* @date 2016年7月1日 下午5:01:26
*/
public class Demo {
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
System.out.println("我是新创建的线程,我执行了......");
};
}.start();
System.out.println("我是主线程,我执行结束了");
}
}

如果顺序执行,理应先输出“我是新创建的线程,我执行了......”,然后输出“我是主线程,我执行结束了”(因为代码顺序是这样的)。但是大家测试过之后,一般情况下,结果恰恰相反。其实原因很简单,当一个线程被创建的时候,需要OS重新调用资源才会创建,整个创建过程需要时间;在此时,主线程已经往后执行,已经输出了内容。

参考:《Java特种兵(上册)》--谢宇编著

java并发编程(一)的更多相关文章

  1. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  2. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  3. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  4. 【Java并发编程实战】-----“J.U.C”:CLH队列锁

    在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...

  5. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  6. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  7. 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock

    ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...

  8. Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  9. JAVA并发编程J.U.C学习总结

    前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...

  10. 学习笔记:java并发编程学习之初识Concurrent

    一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...

随机推荐

  1. 淘宝客网站SEO及赚钱与揭密

  2. appium(2)-Setting up Appium

    Setting up Appium Running Appium on Windows Additional Setup for Android App Testing Download latest ...

  3. spring boot 使用redis 及redis工具类

    1-添加maven依赖 2-添加redis配置 3-工具类 1-添加maven依赖 实际上是封装了jedis <!-- redis 依赖--> <dependency> < ...

  4. Mall电商项目总结(二)——nginx负载均衡配置和策略

    1. nginx配置文件 用户在浏览器上输入,http://www.xwld.site/ 实际上是在访问服务器80端口,nginx 监听80端口,将用户的请求转发到8080和9080端口 . upst ...

  5. linux应用之用户管理相关命令

    1. useradd useradd 命令可以创建一个新的用户帐号,其最基本用法为: useradd 用户名 如输入以下命令: useradd newuser 系统将创建一个新用户 newuser,该 ...

  6. [BZOJ 1475] 方格取数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1475 [算法] 首先将方格黑白染色 , 也就是说 , 如果(i + j)为奇数 , ...

  7. C++类对象之间的类型转换和重载

    类对象和其他类型对象的转换 转换场合有: 赋值转换 表达式中的转换 显式转换 函数调用, 传递参数时的转换 转换方向有: 由定义类向其他类型的转换 由其他类型向定义类的转换 #include < ...

  8. CSS:CSS 颜色

    ylbtech-CSS:CSS 颜色 1.返回顶部 1. 颜色是通过对红.绿和蓝光的组合来显示的. 颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义.对光 ...

  9. Docker 与 宿主机之间的文件cp

    Docker 与 宿主机之间的文件cp 第一种方法是官方比较推荐的,其实和第二种方法实现是一样的. 第一种方法例: 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下. ...

  10. [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...