Java多线程系列一——Java实现线程方法
Java实现线程的两种方法
- 继承Thread类
- 实现Runnable接口
它们之间的区别如下:
1)Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用
2)Thread实现了Runnable接口,并且有更多实用方法
3)实现Runnable接口的线程启动时仍然需要依赖Thread或者java.util.concurrent.ExecutorService
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import org.junit.Assert;
import org.junit.Test; /**
* @Description: 线程的两种实现方法
*/
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 = 0; @Override
public void run() {
map.put(++count, Thread.currentThread().getId());
}
} @Test
public void textThread() {
/**
* 方法一:继承Thread
*/
MethodOne extendsThread = new MethodOne();
extendsThread.start();
/**
* 方法二:实现Runnable
*/
MethodTwo implementsRunnable = new MethodTwo();
new Thread(implementsRunnable).start();
} @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多线程系列三】实现线程同步的方法
两种实现线程同步的方法 方法 特性 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 ...
随机推荐
- Django-rest_framework中利用jwt登录验证时,自定义返回凭证和登录校验支持手机号
安装 pip install djangorestframework-jwt 在Django.settings中配置 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATIO ...
- private关键字
Student.java /* * 学生类 * * 通过对象直接访问成员变量,会存在数据安全问题 * 这个时候,我们就想能不能不让外界对象直接访问成员变量呢? * 答案:能 * 如何实现呢? * pr ...
- 【转】 Java中的IO整理
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...
- Maven 引入外部包
当需要从外部引入一个包(譬如说读写Excel 的POI jar 包 ), 不需要手动地去官网下载一个包然后粘贴到相应的地方. 只需要把Java 工程 转为 Maven 工程 ( 在工程上右键 > ...
- android framework navigationbar自定义
需要实现的目标:在navigationbar上显示录像预览,并且点击按钮可以显示/隐藏NavigationBar 参考文章: http://blog.csdn.net/yanlai20/article ...
- openjudge6252 带通配符的字符串匹配
描述 通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符.通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个 ...
- mysql控制流程函数(case,if,ifnull,nullif)
1.case...when... 用法 参考:http://www.cnblogs.com/qlqwjy/p/7476533.html CASE value WHEN [compare-value] ...
- AOJ731(不等式)
题意:有n(n<=100)个石头,每个石头的价值在Ai~Bi(1<=Ai<=Bi<=10000)之间,将这些石头分给两个人,求两个人的最大总价值差的最小值 分析: 与一般的求最 ...
- 用JQ实现基础的添加,插入,删除功能。
在eclipse里面运行代码即可,如果您是其他应用,请选择对您有帮助的代码即可,如果有写错或不懂的地方请联系QQ:1633420056,谢谢,祝学习进步 <!DOCTYPE html>&l ...
- HashMap源码分析1:添加元素
本文源码基于JDK1.8.0_45. final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { N ...