JAVA并发编程学习笔记------线程的三种创建方式
创建线程一般有如下几个方式:
1. 通过继承Thread类来创建一个线程:
/**
* 步骤1:定义一个继承Thread类的子类
* 步骤2:构造子类的一个对象
* 步骤3:启动线程:
* */
public class ThreadTest{
public static void main(String[] args) {
//构造子类对象
SubThread subThread = new SubThread();
//启动线程
subThread.start();
}
}
//定义继承Thread的子类
class SubThread extends Thread{
public void run(){
System.out.println("Thread test.......");
}
}
2. 通过实现Runnable接口来创建一个线程(静态代理模式)
/**
* 静态代理模式的步骤
* 步骤一: 创建真实角色
* 步骤二: 创建代理角色,持有真实角色的引用
* 步骤三: 两者实现相同的接口
**/
public class RunnableTest {
public static void main(String[] args) {
//创建一个类对象
Runnable subRunnable = new SubRunnable();
//由Runnable创建一个Thread对象
Thread subThread = new Thread(subRunnable);
//启动线程
subThread.start();
}
} //创建实现Runnable接口的类
class SubRunnable implements Runnable{
@Override
public void run() {
System.out.println("Runnable Test......");
}
}
3、通过实现Callable接口来创建一个线程(可返回值,对外声明异常等)
/*
* 步骤一:创建Callable接口的实现类,并重写call()方法
* 步骤二:借助执行调度服务ExecutorService获取Future对象
* 步骤三: get()方法获取值
* 步骤四: shutdownNow()方法停止服务
*/
public class CallableTest {
public static void main(String[] args) {
//借助执行调度服务ExecutorService获取Future对象
ExecutorService ser = Executors.newFixedThreadPool(2);
Race test1 = new Race("LiLei");
Race test2 = new Race("HanMeimei");
Future<String> res1 = ser.submit(test1);
Future<String> res2 = ser.submit(test2); try {
//get()方法获取值
System.out.println(res1.get());
System.out.println(res2.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//shutdownNow()方法停止服务
ser.shutdownNow();
}
} //创建Callable接口的实现类
class Race implements Callable<String> {
private String name; public Race(String name) {
super();
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String call() throws Exception {
return "Hello "+ name +"......";
}
}
总结:
1、推荐使用接口,原因如下:
1)避免单继承的局限性;
2)便于共享资源
2、两种实现接口的方式(Runnable和Callable)的区别:
1)Callable的启动方法是call(),Runnable的启动方法是run()
2)Callable的任务执行后可返回值,而Runnable的任务无返回值
3)Callable的call方法可以抛出异常,Runnable的run方法不可以
4)Callable任务可以获取Future对象,这个对象提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
JAVA并发编程学习笔记------线程的三种创建方式的更多相关文章
- Java并发编程学习笔记
Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现R ...
- Java并发编程学习笔记 深入理解volatile关键字的作用
引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...
- Java并发编程学习:线程安全与锁优化
本文参考<深入理解java虚拟机第二版> 一.什么是线程安全? 这里我借<Java Concurrency In Practice>里面的话:当多个线程访问一个对象,如果不考虑 ...
- [转]JAVA并发编程学习笔记之Unsafe类
1.通过Unsafe类可以分配内存,可以释放内存:类中提供的3个本地方法allocateMemory.reallocateMemory.freeMemory分别用于分配内存,扩充内存和释放内存,与C语 ...
- JAVA并发编程学习笔记------多线程调优
1. 多线程场景下尽量使用并发容器代替同步容器 (如ConcurrentHashMap代替同步且基于散列的Map, 遍历操作为主要操作的情况下用CopyOnWriteArrayList代替同步的Lis ...
- Java 并发编程学习笔记 理解CLH队列锁算法
CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁.结点之间是通过隐形的链表相连,之所以叫隐形的链 ...
- java多线程总结一:线程的两种创建方式及比较
1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应 ...
- java多线程总结一:线程的两种创建方式及优劣比较
1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...
- Java并发编程学习笔记(三)——对象的组合
重要概念: 1.在设计线程安全类的过程中,需要包含以下三个基本要素: (1)找出构成对象状态的所有变量. (2)找出约束状态变量的不变性条件. (3)建立对象状态的并发访问管理策略. 2.
随机推荐
- hackerrank [Week of Code 33] Bonnie and Clyde
任意门 题意:给一个图,每次询问给三个点a,b,c,问是否存在一条从a到c,一条b到c的路径除c外无交点. 双连通分量缩点建出圆方树是必须的,然后我们需要判断c是否在a到b的路径上,或者c的某个相邻的 ...
- 51 nod 1297 管理二叉树
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1297 先是暴力加优化T了最后两个点…… 我还是来想想正解吧. ...
- [51nod1206]Picture
给你一坨矩形,问这些矩形组成的所有多边形的周长之和. 分别求竖着的边和横着的边. 离散化后线段树,维护当前行(或者列)有多少没在多边形里的,添加矩形就变成添加.删除线段. 每次加线段或删线段时累加一下 ...
- c++中的overload、overwrite、override
作为初学者,本文只从语法和简单的使用角度对overload.overwrite.override进行了区分,不曾涉及原理,记录下来以供查阅. 1.verload(重载) 1.1 基本要求: c++中的 ...
- [国嵌攻略][171][V4L2图像编程接口深度学习]
V4L2摄像编程模型 1.打开摄像头设备文件 2.获取驱动信息-VIDIOC_QUERYCAP 3.设置图像格式-VIDIOC_S_FMT 4.申请帧缓冲-VIDIOC_REQBUFS 5.获取帧缓冲 ...
- [国嵌攻略][069][Bootm命令移植]
Bootloader作用 1.初始化软硬件 2.启动操作系统 内核分类 1.zImage 不加信息头的内核 2.uImage 加信息头后的内核,用bootm命令来启动 bootm作用 1.检测信息头: ...
- textarea自适应高度,div模仿textarea可编辑实现自适应高度,placeholder使用图标
1.textarea自适应高度,placeholder使用图标 自适应高度,有很多种办法: 1)jq: $("textarea").on("input",fun ...
- ItemCF_基于物品的协同过滤_MapReduceJava代码实现思路
ItemCF_基于物品的协同过滤 1. 概念 2. 原理 如何给用户推荐? 给用户推荐他没有买过的物品--103 3. java代码实现思路 数据集: 第一步:构建物品的同现矩阵 第 ...
- Spark算子--cogroup
转载请标明出处http://www.cnblogs.com/haozhengfei/p/b612b1e6d9b951fad5574cd0ce573d7e.html cogroup--Transform ...
- 配置国内PIP源方法
python开发者都知道,当我们pip install安装扩展库的时候,经常遇到安装失败(超时)等,有时候是因为国外镜像被屏蔽了,带来不少麻烦, 随着国内python开发的增多,越来越多企业都开放了自 ...