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 ...
随机推荐
- LeetCode(43)Multiply Strings
题目 Given two numbers represented as strings, return multiplication of the numbers as a string. Note: ...
- AutoMapper 使用总结1
初识AutoMapper 在开始本篇文章之前,先来思考一个问题:一个项目分多层架构,如显示层.业务逻辑层.服务层.数据访问层.层与层访问需要数据载体,也就是类.如果多层通用一个类,一则会暴露出每层的字 ...
- 九度教程第22题——今年暑假不AC(看尽量多的电视节目)
#define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <algorithm> using namespace ...
- Javascript类型转换的规则全面&附有实例
Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改变.请看示例: 1 2 3 var n = 10; n = "hel ...
- POJ1094 / ZOJ1060
#include <cstdio> #include <cstring> #include <stack> #include <iostream> us ...
- 计蒜客15430 XOR Queries(Trie处理位运算问题)
题意: 给出一个长度为n的数组C,回答m个形式为(L, R, A, B)的询问, 含义为存在多少个不同的数组下标k属于[L, R]满足C[k] XOR A >= B(式中XOR为异或运算). T ...
- MongoDB小结27 - 聚合管道【$project】
我们有这样的数据 { "_id" : 1, title: "abcdef", isbn: "6969696969", author: { l ...
- iOS 自己主动释放手动释放混编
当项目为手动释放时,Build Settings中,Objective-c Automatic Reference Conting 为YES 时,想要手动管理一些文件,在CompileSources中 ...
- TCP打洞与UDP打洞的差别
为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现? 如果如今有内网clientA和内网clientB.有公网服务端S. 如果A和B ...
- Unix时间戳(Unix timestamp)转换
http://tool.chinaz.com/Tools/unixtime.aspx 如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)? Java time JavaScr ...