java中实现多线程的三种方式
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中实现多线程的三种方式相关推荐
- Java中实现接口的三种方式您造吗?
本文介绍了Java中实现接口的三种方式:常规实现方式.匿名内部类和 Lambda表达式实现方式.希望已经了解的同学可以重新温习一下,不了解的同学则从中受益! Java中接口最常规的实现方式 同学们都会 ...
- java中Map遍历的三种方式
Java中Map遍历的三种方式 前言 一:在for循环中使用entries实现Map的遍历: 二:在for循环中遍历key或者values,一般适用于只需要map中的key或者value时使用,在性能 ...
- Java中创建线程的三种方式
Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)继承Thread类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. ...
- 代码示例:Java中定义数组的三种方式
在Java中,数组的定义有三种方式,其基本语法格式如下: 数组类型[] 数组名 = new 数组类型[数组长度]; 数组类型[] 数组名 = new 数组类型[]{数组元素0,数组元素1,...}; ...
- Java中实现多线程的两种方式之间的区别
Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...
- Java中实现多线程的几种方式
1)继承Thread类 实现的步骤: 1)创建Thread类的子类 2)重写run方法 3)创建线程对象 4)启动线程 代码示例: package com.bobo.thread;public cla ...
- java中数组遍历的三种方式
使用显示数组 for,for-each,和toString 题目描述 1.for循环遍历 程序: 运行结果: 2.foreach语句遍历 语法格式: 注: 运行结果: 程序: 运行结果: 3.Arra ...
- Java中数组赋值的三种方式
推荐第一种: public class ArrayTest{public static void main(String args[]){// 1int[] a=new int[4];a[0]=1;a ...
- java中方法调用的三种方式
直接调用:方法名称(实际参数) 输出调用:把方法调用放到输出语句中,注意:输出调用时,调用的方法必须有返回值 [System.out.println(getSum(12,13))]; 赋值调用:把方法 ...
最新文章
- WPF入门知识(学习)
- python程序打完后怎么保存_如何保存要在之后使用的值应用程序执行()在python中退出?...
- matlab根据url链接下载*.tar文件并解压
- netty心跳过程中 发送消息失败_Netty 4.0 实现心跳检测和断线重连
- Livejourmal是什么
- 什么是epoll的水平触发与边缘触发?两段代码彻底理解
- java web html5区别_html5和html有什么区别啊?
- csdn泄漏密码分析
- 自动化测试平台(七):头像展示、下拉菜单及用户管理模块增删改功能实现
- 360面临两线作战----手机安全领域硝烟再起
- 基于zk4500的指纹识别C#实现
- jQuery排他思想(siblings)
- 各操作系统支持图标字体的终端推荐
- 【转载精品】Web Service到底是什么?
- 【观察】从新华三2022十大技术趋势,看数字化如何重塑未来社会
- DDD 到底是银弹还是垃圾
- 唯样商城:扩展用于汽车以太网的 ESD 保护解决方案产品组合
- php类与对象听不明白,PHP类与对象使用---技巧总结
- JS判断某年某月有多少天
- 中国垃圾分类产业链现状动态及未来发展前景预测报告(2022-2027年)