java并发编程(一)
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并发编程(一)的更多相关文章
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
- Java并发编程:volatile关键字解析
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
- JAVA并发编程J.U.C学习总结
前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...
- 学习笔记:java并发编程学习之初识Concurrent
一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...
随机推荐
- checkbox复选框的使用
复选框: <input type="checkbox" name="favor" value="唱歌"/>唱歌 <i ...
- [Spring Batch 系列] 第一节 初识 Spring Batch
距离开始使用 Spring Batch 有一段时间了,一直没有时间整理,现在项目即将完结,整理下这段时间学习和使用经历. 官网地址:http://projects.spring.io/spring-b ...
- (linux)struct inode 和 struct file
转自:http://www.cnblogs.com/QJohnson/archive/2011/06/24/2089414.html 1.struct inode──字符设备驱动相关的重要结构介绍 内 ...
- 在react里面使用jquery插件
在react里面使用jquery插件 背景: 虽然现在react,vue等框架开启了前端开发的新篇章, 但对于一些比较复杂的页面,比如想在项目里面生成 组织架构图,人员汇报关系等还是需要用到之前的 j ...
- extjs grid renderer参数用法
今天在导出EXT的二维时老是报错,追进去看是renderer : function(value)的参数不对,经过一番研究,未免以后遇到再次浪费时间,记录一下. var cm = new Ext.gri ...
- git删除某次提交(某个commit)的方法【转】
本文转载自:https://www.36nu.com/post/275 git删除某次提交(某个commit)的方法 疯狂的兔子 发表于 4个月前 阅读 536 收藏 0 推荐 0 评论 0 推荐收藏 ...
- codeforces 463A Caisa and Sugar 解题报告
题目链接:http://codeforces.com/problemset/problem/463/A 题目意思:某个人有 s dollar的钱,有 n 种类型的糖果,第 i 种糖果的价值为 xi d ...
- html5--3.22 综合实例03
html5--3.22 综合实例03 学习要点 通过一个综合实例来回顾学过的内容 这一章的内容比较多,不必强求一下子全记住,多做一些练习,用得多了自然就可以记住了 可以自己找一些实例练练手,比如各网站 ...
- {{badmatch, {error, eexist}}
今天在编译cowboy工程在resolve release build时提示编译错误:{{badmatch, {error, eexist}} 后经调查可能是因为rebar的bug导致的,可是删除_b ...
- 002 - 配置Pycharm的背景颜色为豆沙绿护眼
本文记录的是Pycharm2017年1月版本 Pycharm有自带的主题可供选择, 好多小伙伴喜欢使用Monoka的风格 但是也有不是很喜欢黑底风格的小伙伴可以使用默认主题+豆沙绿来替代 默认主题是白 ...