【Java多线程系列一】Java实现线程方法
Java实现线程的两种方法
- 继承Thread类
- 实现Runnable接口
它们之间的区别如下:
- Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用
- Thread实现了Runnable接口,并且有更多实用方法
- 实现Runnable接口的线程启动时仍然需要依赖Thread或者java.util.concurrent.ExecutorService
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import org.junit.Assert;
import org.junit.Test; /**
* 线程的两种实现方法
*/
public class ThreadImplementTest { private Map<Integer, Long> map = new ConcurrentHashMap<>(); class MethodOne extends Thread {
private int count = 0; @Override
public void run() {
map.put(++count, this.getId());
}
} class MethodTwo implements Runnable {
private int count = 31; @Override
public void run() {
map.put(++count, Thread.currentThread().getId());
}
} @Test
public void testThread(){
//方法一:继承Thread
MethodOne extendsThread = new MethodOne();
extendsThread.start(); //方法二:实现Runnable接口
MethodTwo implementsRunnable = new MethodTwo();
new Thread(implementsRunnable).start();
System.out.println("ddd");
} @Test
public void testTwoRuns() throws InterruptedException{
/*
* 注意:一下两种方法启动方式截然不同
*/
Thread tmp;
MethodOne extendsThread = new MethodOne();
for (int i = 0; i < 3; i++) {//只有一个线程
tmp = new Thread(extendsThread);
tmp.start();
tmp.join();
} Assert.assertTrue(map.containsKey(3));
Assert.assertTrue(map.containsKey(2));
Assert.assertTrue(map.containsKey(1)); map.clear();// 清空缓存
for (int i = 0; i < 3; i++) {// 三个不同线程
tmp = new MethodOne();
tmp.start();
tmp.join();
}
Assert.assertEquals(1, map.size());
Assert.assertTrue(map.containsKey(1));
}
}
【Java多线程系列一】Java实现线程方法的更多相关文章
- Java多线程系列一——Java实现线程方法
Java实现线程的两种方法 继承Thread类 实现Runnable接口 它们之间的区别如下: 1)Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用2) ...
- 【Java多线程系列三】实现线程同步的方法
两种实现线程同步的方法 方法 特性 synchronized 不需要显式的加锁,易实现 ReentrantLock 需要显式地加解锁,灵活性更好,性能更优秀,结合Condition可实现多种条件锁 ...
- Java多线程系列 基础篇02 线程的创建和运行
1.线程创建的方式常用有两种 1. 继承 Thread 类创建线程 2. 实现 Runnable 接口创建线程 2.Thread 和 Runnable的区别 Thread和Runnable的相同点:都 ...
- Java多线程系列 基础篇03 线程的优先级和守护线程
1. 线程优先级 现代操作系统中基本上使用时间分片的方式调度线程,通过设置线程优先级,使优先级高的线程获得时间片的次数多于优先级低的线程. 在java 线程中,通过一个整形变量prority来控制优先 ...
- Java多线程系列二——Thread类的方法
Thread实现Runnable接口并实现了大量实用的方法 public static native void yield(); 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机 ...
- 【java多线程系列】java内存模型与指令重排序
在多线程编程中,需要处理两个最核心的问题,线程之间如何通信及线程之间如何同步,线程之间通信指的是线程之间通过何种机制交换信息,同步指的是如何控制不同线程之间操作发生的相对顺序.很多读者可能会说这还不简 ...
- java多线程系列5-死锁与线程间通信
这篇文章介绍java死锁机制和线程间通信 死锁 死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象. 同步代码块的嵌套案例 public class MyLock { // 创建两 ...
- Java多线程系列 基础篇01 线程的状态
1.进程和线程 进程: 计算机中程序关于某数据集合的一次运行活动,是计算机系统进行资源分配和调度的基本单位,是操作系统结构的基础. 线程: 线程是进程的实例,是CPU进行资源分配和调度的最小单位,线程 ...
- 【Java多线程系列四】控制线程执行顺序
假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...
- (Java多线程系列五)守护线程
守护线程 什么是守护线程 Java中有两种线程,一种是用户线程,一种是守护线程. 当进程不存在或主线程停止,守护线程也会自动停止. class DaemonThread extends Thread ...
随机推荐
- (3)C++复合类型
存储数据时必须跟踪的三个属性:信息储存在何处,存储的值,存储的类型 一.数组 #include <iostream> using namespace std; int main() { / ...
- 编译Android系统源码和内核源码
[日期:2016-01-11] 来源:Linux社区 作者:jiangwei [字体:大 中 小] 把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...
- ASP.NET Core项目目录结构介绍
我们下面通过在Visual Studio 2017中创建一个空的Web应用程序来详细说明下asp.net core项目目录结构: 1.项目结构说明 (1).依赖项 这里主要分两部分SDK, 目前这两部 ...
- Mosaic
Mosaic 是最古老的WEB浏览器,这是个套件FOR WINDOWS(包括TCP/IP,拨号,EMAIL等).
- 7.Jmeter 快速入门教程--录制复杂web测试脚本
Jmeter的功能简单,不需要有脚本语言的编写经验,纯图形界面添加测试场景, 用起来上手很快.但是如果手动添加每一个web(http/https)请求,费时又费力.而且有可能最后手动编写的和实际发的请 ...
- Django框架(二十三)—— Django rest_framework-解析器
解析器 一.解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理,将传过来的数据解析成字典 二.使用解析器 1.局部使用 在视图类中重定义parser_classe ...
- Django框架(十四)—— Django分页组件
目录 Django分页组件 一.分页器 二.分页器的使用 三.案例 1.模板层 2.视图层 Django分页组件 一.分页器 数据量大的话,可以分页获取,查看 例如:图书管理中,如果有成千上万本书,要 ...
- Jmeter+ InfluxDB+Grafana安装配置
前置条件: 系统:windows jmeter:5.1 InfluxDB安装 下载InfluxDB-v1.7.9和Chronograf-v1.7.14(InfluxDB的可视化web端). 下载完成之 ...
- JSONObject.toJSONString(map)
Map<Integer, List<Integer>> map = new LinkedHashMap<>(); map.put(1,ddzCard.getOneS ...
- Oracle 一个表的数据update到另一个表
A表数据 B表数据 现在要把B表 B_COSTS 的值update到A表 A_COSTS 字段 SQL语法: update a set (a.a_costs) = (select b. ...