java中实现多线程的三种方式

1、实现多线程的方法:
 在java中实现多线程的两途径:继承Thread类,实现Runable接口(Callable)
2、继承Thread类实现多线程:

​ 继承类Thread是支持多线程的功能类,只要创建一个子类就可以实现多线程的支持。

所有的java程序的起点是main方法,所以线程一定有自己的起点,那这个起点就是run方法;因为多线程的每个主体类之中必须重写Thread的run方法。

public void run()

这个run方法没有返回值,那就说明线程一旦开始就一直执行不能返回内容。

2.1线程案例:

​ 编写一个测试线程类继承Thread 在run方法中写一个循环输出语句;

分析:创建多个测试类启动线程,多个线程回想进程一样,轮流抢占资源,所以多线程程序应该是多个线程彼此交替执行;

class TestThread extends Thread{//内部类String name;TestThread( String name){this.name=name;}@Overridepublic void run(){for(int i=1;i<10;i++) {System.out.print(name + i);}}}public class MyThread  {public static void main(String[] args) {new TestThread("A").run();new TestThread("B").run();new TestThread("C").run();}
}

上面是调用Thread的run方法,但是查看日志输出并不是交替输出如下

A1A2A3A4A5A6A7A8A9B1B2B3B4B5B6B7B8B9C1C2C3C4C5C6C7C8C9

本线程类的功能是进行循环的输出操作,所有的线程与进程是一样的,都必须轮流去抢占资源,所以多线程的执行应该是多个线程彼此交替执行,也就是说如果调用了run方法,那么并不能够启动多线程,多线程启动的唯一方法是调用Thread的start方法(调用此方法执行的是run方法体)。

修改如下:

public class MyThread  {public static void main(String[] args) {new TestThread("A").start();new TestThread("B").start();new TestThread("C").start();}
}

运行结果

B1C1A1C2C3B2B3C4A2A3A4A5A6A7A8A9C5C6C7B4B5B6B7B8B9C8C9

疑问?为什么多线程的启动不是调用run方法而必须调用start方法?

找到java的源代码:在jdk安装的目录找到src压缩包解压,在java.lang包里的Thread的start方法如下:

   public synchronized void start() {if (threadStatus != 0)throw new IllegalThreadStateException();group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}}private native void start0();

在start方法里,开始的地方有IllegalThreadStateException异常抛出,防止线程启动重复。

​ 发现在start方法里面要调用一个start0方法,而且此方法的结构和抽象方法类似,使用了native声明,在Java开发里面有一门技术称为JNI技术(Java Native Interface),这门技术的特点:是使用Java调用本机操作系统提供的函数。但是有个缺点:不能够离开特定的操作系统。

总结:使用Thread类的start方法不仅仅启动多线程的执行代码,还要从不同操作系统中分配资源。

3、实现Runnable

​ Java具有单继承局限,所有的Java程序针对类的继承都应该是回避,那么线程也一样,为了解决单继承的限制,因此才有Runnable接口代码如下:

@FunctionalInterface
public interface Runnable{public void run();
}

这个接口有点特殊是@FunctionalInterface注解修饰的,这是函数式接口,特征是:一个接口只有一个方法。

接口中的方法都是public权限,不存在默认权限。

使用方法:让一个类实现Runnable接口即可,并且也需要覆写run()方法。

疑问:但是此接口只有run方法,没有start方法,怎么启动多线程呢?

不管任何情况下,如果要想启动多线程一定要依靠Thread类完成,在Thread类中有参数是Runnable参数的构造方法:

  • Thread(Runnable target) 接收的是Runnable接口

可以创建一个参数是Runnable实现类的Thread类,调用start方法启动。

public class MyThread  {public static void main(String[] args) {new Thread(new TestThread("A")).start();new Thread(new TestThread("B")).start();new Thread(new TestThread("C")).start();}
}

总结:实现Runnable接口来写多线程的业务类,用Thread来启动多线程。

java中实现多线程的三种方式相关推荐

  1. Java中实现接口的三种方式您造吗?

    本文介绍了Java中实现接口的三种方式:常规实现方式.匿名内部类和 Lambda表达式实现方式.希望已经了解的同学可以重新温习一下,不了解的同学则从中受益! Java中接口最常规的实现方式 同学们都会 ...

  2. java中Map遍历的三种方式

    Java中Map遍历的三种方式 前言 一:在for循环中使用entries实现Map的遍历: 二:在for循环中遍历key或者values,一般适用于只需要map中的key或者value时使用,在性能 ...

  3. Java中创建线程的三种方式

    Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)继承Thread类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. ...

  4. 代码示例:Java中定义数组的三种方式

    在Java中,数组的定义有三种方式,其基本语法格式如下: 数组类型[] 数组名 = new 数组类型[数组长度]; 数组类型[] 数组名 = new 数组类型[]{数组元素0,数组元素1,...}; ...

  5. Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  6. Java中实现多线程的几种方式

    1)继承Thread类 实现的步骤: 1)创建Thread类的子类 2)重写run方法 3)创建线程对象 4)启动线程 代码示例: package com.bobo.thread;public cla ...

  7. java中数组遍历的三种方式

    使用显示数组 for,for-each,和toString 题目描述 1.for循环遍历 程序: 运行结果: 2.foreach语句遍历 语法格式: 注: 运行结果: 程序: 运行结果: 3.Arra ...

  8. Java中数组赋值的三种方式

    推荐第一种: public class ArrayTest{public static void main(String args[]){// 1int[] a=new int[4];a[0]=1;a ...

  9. java中方法调用的三种方式

    直接调用:方法名称(实际参数) 输出调用:把方法调用放到输出语句中,注意:输出调用时,调用的方法必须有返回值 [System.out.println(getSum(12,13))]; 赋值调用:把方法 ...

最新文章

  1. WPF入门知识(学习)
  2. python程序打完后怎么保存_如何保存要在之后使用的值应用程序执行()在python中退出?...
  3. matlab根据url链接下载*.tar文件并解压
  4. netty心跳过程中 发送消息失败_Netty 4.0 实现心跳检测和断线重连
  5. Livejourmal是什么
  6. 什么是epoll的水平触发与边缘触发?两段代码彻底理解
  7. java web html5区别_html5和html有什么区别啊?
  8. csdn泄漏密码分析
  9. 自动化测试平台(七):头像展示、下拉菜单及用户管理模块增删改功能实现
  10. 360面临两线作战----手机安全领域硝烟再起
  11. 基于zk4500的指纹识别C#实现
  12. jQuery排他思想(siblings)
  13. 各操作系统支持图标字体的终端推荐
  14. 【转载精品】Web Service到底是什么?
  15. 【观察】从新华三2022十大技术趋势,看数字化如何重塑未来社会
  16. DDD 到底是银弹还是垃圾
  17. 唯样商城:扩展用于汽车以太网的 ESD 保护解决方案产品组合
  18. php类与对象听不明白,PHP类与对象使用---技巧总结
  19. JS判断某年某月有多少天
  20. 中国垃圾分类产业链现状动态及未来发展前景预测报告(2022-2027年)

热门文章

  1. 百度网盘BaiduPCS-Go突破下载限制
  2. 阿里P7大佬 兼职干这个,每天2小时,月入3万多!
  3. 抖音、快手变长,B站、趣头条变短
  4. Gen2-UHF-RFID-Reader学习(六)reader
  5. Atiti.大企业病与小企业病 大公司病与小公司病
  6. 【Android】录屏功能实现——MediaProjection
  7. python入门指南小说免费阅读-python3.6.0入门指南(官方版).pdf
  8. 基于matlab 汉字字符识别——神经网络
  9. MarkDown中如何换行?
  10. halcon脚本-电池正反检测【附源码】