java线程之基础学习总结

线程实现的两种方式:

在java中可以有两种方式实现多线程操作,一种是继承Thread类,另外一种是实现Runnable接口。

继承Thread类

Thread类是在java.lang包中定义的

一个类只要继承Thread类,要覆写run()方法。

简单实例

定义MyThread类

  1. 定义MyThread类
  2. public class MyThread extends Thread {
  3. private String name;
  4. public MyThread(String name) {
  5. this.name = name;
  6. }
  7. public void run() {
  8. for (int i = 0; i < 5; i++) {
  9. System.out.println(name + "运行:" + i);
  10. }
  11. }
  12. }

编写TestThread类调用:

  1. public class TestThread {
  2. public static void main(String[] args) {
  3. MyThread myThread1 = new MyThread("singsong1");
  4. MyThread myThread2 = new MyThread("singsong2");
  5. myThread1.run();
  6. myThread2.run();
  7. }
  8. }
  1. 运行结果:
  2. singsong1运行:0
  3. singsong1运行:1
  4. singsong1运行:2
  5. singsong1运行:3
  6. singsong1运行:4
  7. singsong2运行:0
  8. singsong2运行:1
  9. singsong2运行:2
  10. singsong2运行:3
  11. singsong2运行:4

从结果可以发现,此时的执行非常的有规律,先执行完第一个对象,再执行第二个对象。

把run()方法换成start();一旦调用start()方法,则会通过JVM找到run()方法

Public void start()

使用start()方法启动线程:

  1. public class TestThread {
  2. public static void main(String[] args) {
  3. MyThread myThread1 = new MyThread("singsong1");
  4. MyThread myThread2 = new MyThread("singsong2");
  5. myThread1.start();
  6. myThread2.start();
  7. }
  8. }
  1. 运行结果:
  2. singsong1运行:0
  3. singsong1运行:1
  4. singsong2运行:0
  5. singsong1运行:2
  6. singsong2运行:1
  7. singsong1运行:3
  8. singsong2运行:2
  9. singsong1运行:4
  10. singsong2运行:3
  11. singsong2运行:4

从运行结果可以知道,程序时交互式的运行。

因为需要用到CPU的资源,所以每次的运行结果基本是都不一样的

不要调用Thread类或Runnable对象的run方法。直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。应该调用Thread.start()方法。这个方法将创建一个执行run方法的新线程。


Runnable接口的实现

简单实例

  1. public class RunnableThread implements Runnable {
  2. private String name;
  3. public RunnableThread(String name) {
  4. this.name = name;
  5. }
  6. public void run() {
  7. for (int i = 0; i < 5; i++) {
  8. System.out.println(name + "运行:" + i);
  9. }
  10. }
  11. }

编写TestThread1调用

  1. public class TestThread1 {
  2. public static void main(String[] args) {
  3. RunnableThread runnableThread1=new RunnableThread("singsong1");
  4. RunnableThread runnableThread2=new RunnableThread("singsong2");
  5. Thread thread1= new Thread(runnableThread1);
  6. Thread thread2= new Thread(runnableThread2);
  7. thread1.start();
  8. thread2.start();
  9. }
  10. }
  1. 运行结果:
  2. singsong1运行:0
  3. singsong1运行:1
  4. singsong2运行:0
  5. singsong2运行:1
  6. singsong2运行:2
  7. singsong2运行:3
  8. singsong2运行:4
  9. singsong1运行:2
  10. singsong1运行:3
  11. singsong1运行:4

Thread类和Runnable接口区别

最大区别是在于资源的共享

如果一个类继承Thread,则资源共享不可共享。而实现Runable接口,能实现资源共享。

例如:

MyThread类

  1. public class MyThread extends Thread {
  2. private int ticket = 5;
  3. private String name;
  4. public MyThread(String name) {
  5. this.name = name;
  6. }
  7. public void run() {
  8. for (int i = 0; i < 15; i++) {
  9. if (ticket > 0) {
  10. System.out.println(name + "正售出第 " + (ticket--) + "票");
  11. }
  12. }
  13. }
  14. }
  15. 调用:
  16. public class TestThread {
  17. public static void main(String[] args) {
  18. MyThread myThread1 = new MyThread("singsong1");
  19. MyThread myThread2 = new MyThread("singsong2");
  20. myThread1.start();
  21. myThread2.start();
  22. }
  23. }
  24. 运行结果:
  25. singsong1正售出第 5票
  26. singsong1正售出第 4票
  27. singsong1正售出第 3票
  28. singsong1正售出第 2票
  29. singsong1正售出第 1票
  30. singsong2正售出第 5票
  31. singsong2正售出第 4票
  32. singsong2正售出第 3票
  33. singsong2正售出第 2票
  34. singsong2正售出第 1票

重复售出了一次

再来看看Runnable接口是怎么实现资源共享的

RunnableThread类

  1. public class RunnableThread implements Runnable {
  2. private int ticket = 5;
  3. private String name;
  4. public RunnableThread(String name) {
  5. this.name = name;
  6. }
  7. public void run() {
  8. for (int i = 10; i > 0; i--) {
  9. if (ticket > 0) {
  10. System.out.println(name + "正售出第 " + (ticket--) + "票");
  11. }
  12. }
  13. }
  14. }

编写TestThread1类调用:

  1. public class TestThread1 {
  2. public static void main(String[] args) {
  3. RunnableThread runnableThread1 = new RunnableThread("singsong1");
  4. Thread thread1 = new Thread(runnableThread1);
  5. Thread thread2 = new Thread(runnableThread1);
  6. thread1.start();
  7. thread2.start();
  8. }
  9. }
  10. 运行结果:
  11. singsong1正售出第 5票
  12. singsong1正售出第 4票
  13. singsong1正售出第 3票
  14. singsong1正售出第 2票
  15. singsong1正售出第 1票

从运行结果可以得出实现Runnable接口的优点。

大家有没有想过Runnable接口为什么能实现资源的共享,而Thread类不能

本人个人理解

首先看如下代码:

  1. public class TestThread1 {
  2. public static void main(String[] args) {
  3. RunnableThread runnableThread1 = new RunnableThread("singsong1");
  4. RunnableThread runnableThread2 = new RunnableThread("singsong2");
  5. Thread thread1 = new Thread(runnableThread1);
  6. Thread thread2 = new Thread(runnableThread2);
  7. thread1.start();
  8. thread2.start();
  9. }
  10. }

此代码是在TestThread1类的继承上修改的:添加了    RunnableThread runnableThread2 = new RunnableThread("singsong2");

把runnableThread1换成runnableThread2

现在我们在运行程序看看结果:

  1. singsong1正售出第 5票
  2. singsong1正售出第 4票
  3. singsong1正售出第 3票
  4. singsong1正售出第 2票
  5. singsong1正售出第 1票
  6. singsong2正售出第 5票
  7. singsong2正售出第 4票
  8. singsong2正售出第 3票
  9. singsong2正售出第 2票
  10. singsong2正售出第 1票

从结果可以知道也重复了一次。

总结一下:也是就说Runnable接口能实现资源的共享是因为用同一个实现Runnable接口的子类来创建不同的线程,去执行同一个任务。而Thread却没有这种机制。

转载于:https://blog.51cto.com/singsong/1163248

java线程之基础学习相关推荐

  1. 【韩顺平】Java线程(基础)知识点总结

    文章目录 1.线程概念 1.1程序 1.2进程 1.3线程 2.其他相关概念 2.1并发 2.2并行 2.3单线程 2.4多线程 3.创建线程的两种方法 3.1继承Thread类,重写run方法 3. ...

  2. java线程runnable_java基础----多线程之Runnable(一)

    java线程的创建有两种方式,这里我们通过简单的实例来学习一下.一切都明明白白,但我们仍匆匆错过,因为你相信命运,因为我怀疑生活. java中多线程的创建 一.通过继承Thread类来创建多线程 pu ...

  3. java培训 | 零基础学习java开发的学习方法有哪些

    随着IT行业的不断发展,java根据自身的优势,得到大中小企业的青睐,由此可见java开发的应用市场不断扩大.有许多小伙伴进军java开发行业,那零基础学习java开发的学习方法有哪些? 无论是学习什 ...

  4. java三板斧_JAVA基础学习 三板斧

    JAVA基础学习 -1 三板斧 1. 引子 最近因为工作需要,开始学习JAVA,我之前常用的编程语言是C,C#,C++,基本没有用JAVA,JAVA需要从基础开始学习了. JAVA是从C++优化而来: ...

  5. Java小白零基础学习如何突破自己的方法

    有很多Java程序员在学习之初经常对如何学习感到困惑.本文将分析如何学习Java编程,并相信它可以帮助处于混乱状态的初学者. I.培养兴趣 兴趣是可以让你继续前进的动力.如果你只是把这个程序写成谋生手 ...

  6. 零基础是学java还是python-零基础学习编程,Java、Python你会选择哪个?

    现在很多零基础的小伙伴都想要进入到编程行业之中,无论什么情况选择哪门语言都非常重要,毕竟关系到以后的发展和薪资,很多人都知道Python是当下很火的语言,也知道Java是非常高级的编程语言,问题来了, ...

  7. 【Java】零基础学习Java需要多久?

    其实学java一般要多久?因人而异,例如一个零基础的小白自学java,每天学习8个小时来算,而且在有学习资料的基础上,每天学习,从零到找到工作,起码要半年起步,而且还要有项目经验,否则是不会有公司要你 ...

  8. java线程wait_java多线程学习(四) 之 wait和notify

    ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和not ...

  9. 无基础怎么学习java虚拟机,0基础学习Java ——Java 虚拟机结构(上)

    马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 回忆一遥远 于 2017-8-16 07:35 编辑 Class 文件格式 Java 编 ...

最新文章

  1. 杭电 hdu 1003
  2. Android--制作开场动画/MediaPlayer OnCompletionListener
  3. createrepo常用参数
  4. Java统计文件夹中文件总行数
  5. 如何使用Chrome command API查找SAP Spartacus的router-outlet
  6. ios 上传图片失败 小程序_微信小程序ios端 使用ajaxSubmit上传图片失败,android没问题...
  7. 串口 多个activity 安卓_一个Activity实时向另一个Activity发送消息
  8. T4 Templates and the Entity Framework
  9. 步骤mysql_mysql 安装 等步骤(一)
  10. 20200308: 生成每种字符都是奇数个的字符串灯泡开关 III(leetcode5352-5353)
  11. 邮件归档提升信息价值(上)
  12. 《Android音视频开发》封面由你来投票
  13. vim个性化设置---给脚本文件加注释头信息
  14. 专业的PRD撰写模板
  15. Android保存照片到相册
  16. java开发入行真功夫pdf_Visual C++开发入行真功夫
  17. 自然语言处理之文本分类
  18. 计算机绘图CAD实训指导,【精品】CAD计算机绘图实习指导书
  19. npm ERR! could not determine executable to run
  20. Oracle的软解析(soft prase)和硬解析(hard prase)

热门文章

  1. 树链剖分+线段树 单点修改 区间求和 模板
  2. php审计学习:xdcms2.0.8注入
  3. MVC源码分析 - Action查找和过滤器的执行时机
  4. 【公共类库】加密解密
  5. 【Fanvas技术解密】HTML5 canvas实现脏区重绘
  6. UVALive 5903 Piece it together(二分图匹配)
  7. spring-自动加载配置文件\使用属性文件注入
  8. 如何解决 SQL Server 安装程序中的 COM+ 系统配置检查失败问题
  9. 前端 crypto-js aes 加解密
  10. tornada-数据库