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的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...
随机推荐
- c#4.5新语法--自动属性和隐式类型
1.自动属性 自动属性是c#中属性定义的两种形式的一种:传统属性定义.自动属性. 1.1 传统属性定义 private int _age; public int ...
- access 连接数据库
前提条件 如果没有安装office的话,需要安装引擎 安装了office就不用安装引擎 连接数据库 Dim plMydb As Microsoft.Office.Interop.Access.Dao. ...
- 【Windows核心编程】一个使用内存映射文件进行进程间通信的例子
进程间通信的方式有很多种,其底层原理使用的都是内存映射文件. 本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信. 进程1 按钮[Create mappin ...
- vuejs实现折叠面板展开收缩动画
vuejs通过css3实现元素固定高度到auto高度的动画和auto高度到固定高度的动画. 循环列表,html: <template> <div class="newsli ...
- css position弹性盒子测试
总结: 1.利用样式height:100%设置div高度为全屏时候必须设置所有的父元素,但是父元素那么多,不可控,所以此法不可行: 2.设置父框架的padding为100px,div进行float,p ...
- Codeforces Round #379 (Div. 2) D. Anton and Chess —— 基础题
题目链接:http://codeforces.com/contest/734/problem/D D. Anton and Chess time limit per test 4 seconds me ...
- Android-Universal-Image-Loader使用介绍
简介 Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你.Universal Image Loader for Android的目的 ...
- codeforces A. Black-and-White Cube 解题报告
题目链接:http://codeforces.com/problemset/problem/323/A 题目意思:给定值 k ,需要输出 k 个 k 行 k 列的单位立方体各表示什么颜色(或者是黑色或 ...
- hdu-5003 Osu!(水题)
题目链接: Osu! time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Prob ...
- 一个轻量级AOP的实现(开源)
事先声明,本项目参考AOP in C#和园内大神张逸的文章,思路神马的都不是自己的! 为了让项目的代码看起来更干净,需要一个AOP! 于是就实现了一个非常简单的,非常轻量级,有多轻量级呢? 实现的AO ...