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));
}
}

最新文章

  1. emacs配置eslint 语法检查.找不到node解决
  2. Cubieboard2裸机开发之(三)C语言操作LED
  3. 六个创建模式之单例模式(Singleton Pattern)
  4. JDBC学习笔记(9)——DBUtils的使用
  5. 2015第42周六Pgsql全文索引
  6. Ubuntu 14.04—Eclipse配置Pydev
  7. 关于通过addClass与removeClass用jquery控制有良好兼容的CSS3样式
  8. Linux编译安装Mariadb数据库
  9. 【摘】Oracle 11g EM安全证书问题无法访问的解决办法
  10. PHP文件管理—实现网盘以及压缩包的功能操作
  11. ckeditor_学习(1) 基本使用
  12. linux基础之bash特性
  13. oracle 查询分区表的最大分区以及分区字段的最大值
  14. docker machine 使用教程
  15. 【机器学习】从分类问题区别机器学习类型 与 初步介绍无监督学习算法 PAC
  16. 【scala】scala 数组 (三)
  17. 基尼系数(Gini coefficient),洛伦茨系数
  18. Java学习(匿名对象、内部类、包、import、代码块)
  19. 安装使用babel-polyfill。让IE支持es6
  20. Elasticsearch 插件head和kibana

热门文章

  1. JQuery Mobile 图片布局
  2. 几个比较好的IT站和开发库官网
  3. Python之元组、列表and 字典
  4. ARM发展简史
  5. batch normlization (BN)的讲解
  6. rabbitmq AmqpClient 使用Topic 交换机投递与接收消息,C++代码示例
  7. 欧拉路径 &amp;&amp; 欧拉回路
  8. STM32中使能时钟的目的
  9. mybatis xml中大于号小于号的代替
  10. 59. jdk1.5新特性之----增强for循环