Thread类实现多线程
线程主体类:必须是实现特定的接口或者继承特定的父类才可以完成。
继承Thread类实现多线程
java.lang.Thread
一个类继承了此类表示这个类就是线程的主体类,并且需要覆写线程的主体方法run()。
class MyThread extends Thread{//线程的主体类private String title;public MyThread(String title) {this.title = title;}@Overridepublic void run() {for(int x = 0;x < 10;x++) {System.out.print(this.title + "运行,x = " + x);}}
}
这样我么那就实现了一个多线程的定义,多线程要执行的功能都应该在run()方法中进行定义。在正常情况下如果要使用类中的方法那么肯定要产生实例化对象,而后去调用类中提供的方法,但是run()方法是不能被直接调用的,因为这里面牵扯到操作系统的资源调用问题,所以要想启动多线程就必须使用strat()方法完成"public void start()"。
范例:run()方法和start()方法对比
run():
public class ThreadDemo {public static void main(String[] args) {new MyThread("线程A").run();new MyThread("线程B").run();new MyThread("线程C").run();}
}
结果:
线程A运行,x = 0
线程A运行,x = 1
线程A运行,x = 2
线程A运行,x = 3
线程A运行,x = 4
线程A运行,x = 5
线程A运行,x = 6
线程A运行,x = 7
线程A运行,x = 8
线程A运行,x = 9
线程B运行,x = 0
线程B运行,x = 1
线程B运行,x = 2
线程B运行,x = 3
线程B运行,x = 4
线程B运行,x = 5
线程B运行,x = 6
线程B运行,x = 7
线程B运行,x = 8
线程B运行,x = 9
线程C运行,x = 0
线程C运行,x = 1
线程C运行,x = 2
线程C运行,x = 3
线程C运行,x = 4
线程C运行,x = 5
线程C运行,x = 6
线程C运行,x = 7
线程C运行,x = 8
线程C运行,x = 9
start():
public class ThreadDemo {public static void main(String[] args) {new MyThread("线程A").start();new MyThread("线程B").start();new MyThread("线程C").start();}
}
结果:
线程A运行,x = 0
线程A运行,x = 1
线程B运行,x = 0
线程A运行,x = 2
线程B运行,x = 1
线程B运行,x = 2
线程B运行,x = 3
线程B运行,x = 4
线程C运行,x = 0
线程A运行,x = 3
线程B运行,x = 5
线程B运行,x = 6
线程B运行,x = 7
线程B运行,x = 8
线程B运行,x = 9
线程A运行,x = 4
线程A运行,x = 5
线程A运行,x = 6
线程A运行,x = 7
线程A运行,x = 8
线程A运行,x = 9
线程C运行,x = 1
线程C运行,x = 2
线程C运行,x = 3
线程C运行,x = 4
线程C运行,x = 5
线程C运行,x = 6
线程C运行,x = 7
线程C运行,x = 8
线程C运行,x = 9
通过调用可以发现,虽然调用了start()方法,凡是最终结果还是run()方法,并且所有线程对象都是交替执行的,执行顺序不可控。
为什么多线程的启动不直接使用run()方法而必须使用Thread类中的start方法呢?
观察start方法()袁源代码
public synchronized void start() {if (threadStatus != 0) //判断线程的状态throw new IllegalThreadStateException(); //抛出了一个异常group.add(this);boolean started = false;try {start0(); //在start方法中调用start0这个方法started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) { }}}private native void start0();//只定义了方法名称并没有实现
发现在strart()方法中会抛出一个"IllegalThreadStateException"异常类对象,但是整个程序并没有try..catch处理,因为该异常一定是"RuntimeExceptuion"的子类,每一个线程类的对象只允许启动一次,如果重复启动则会抛出此异常。
例:
public class ThreadDemo {public static void main(String[] args) {MyThread mythread = new MyThread("线程A");mythread.start();mythread.start();//重复调用}
}
结果:
Exception in thread "main" java.lang.IllegalThreadStateException
在Java程序执行的过程之中考虑到对于不同层次开发者的需求,所以其支持有本地的操作系统函数调用,而这项技术就被称为JNI技术(Java Native Interface )(Java本地接口),但是Java开发过程之中并不推荐这样使用,利用这项技术可以使用一些操作系统提供的底层函数进行一些特殊的处理,而在Thread类中提供的start0()实际上表示需要将此方法依赖于不同的操作系统实现。
任何情况下,只要定义了多线程,多线程的启动永远只有一种方案,Thread类中的start()方法。
Thread类实现多线程相关推荐
- 继承Thread类使用多线程
java实现多线程有两种方式,一种是继承Thread类,另外一种就是实现Runnable接口. 两种实现方法的优缺点: 使用Thread类实现多线程局限性就是不支持多继承,因为java是不支持类多继承 ...
- Java继承Thread类创建多线程
Java继承Thread类创建多线程 单线程示例 示例,Example01.java public class Example01{public static void main(String[] a ...
- 多线程Thread类创建多线程
package com.ajax; //多线程Thread类创建多线程 public class Example02 {public static void main(String[] args){n ...
- 多线程介绍与threading模块应用以及使用Thread类创建多线程
1.多线程: 多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率.线程是在同一时间需要完成多项任务的时候实现的. 最简单的比喻多线程就像火车的每一节车厢,而进 ...
- html解析图片url,并用继承Thread类的多线程下载
html解析图片url,并用继承Thread类的多线程下载 pom依赖 Java代码 把对应网页的img元素,通过继承Thread类的多线程下载下来. pom依赖 <dependencies&g ...
- 继承Thread类实现多线程简单实例
继承Thread类实现多线程简单实例 文章目录 继承Thread类实现多线程简单实例 一.多线程的意义 二.多线程的创建 三.代码 一.多线程的意义 1.为什么要使用多线程 (a)提高用户体验或者避免 ...
- 多线程之继承Thread类及多线程内存分析
*创建多线程的一种方式:继承Thread类 * java.lang.Thread是描述多线程的类,要实现多线程程序,一种方式就是继承Thread类 * 1.创建一个类Mythread让其extends ...
- Android开发笔记(四十八)Thread类实现多线程
Thread概述 Thread类是真正的线程,查看源码可见Thread也实现了Runnable接口,但它内部有创建新的工作线程,所以Thread对象运行在与主线程不一样的分线程上. 因为Thread对 ...
- java thread类_Java多线程原理及Thread类详解
多线程原理 代码如下: 自定义线程类: 测试类: 流程图: 程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建.随着调用mt的对象的start方法,另外一 ...
最新文章
- mariadb转mysql_MariaDB/MySQL备份和恢复(二):数据导入、导出
- mysql======基本的数据查询(1)
- Windows XP鲜为人知的70招
- https://www.exploit-db.com/能够成功下载的一个CVE编号
- 消费机器人今年爆发!四大品类瓜分百亿蛋糕
- @bean注解和@component注解的区别_阿里面试题一:spring里面使用xml配置和注解配置区别...
- 【正则表达式】值匹配汉字的正字表达式
- 解决chrome浏览器us-yahoo.com搜索劫持
- c++ long 转 short_C精品编程之——C语言的数据类型、运算符、表达式,精品课程...
- micropython gpio_micropython GPIO
- hibernate 错误 could not determine type for
- 熊猫read_csv()–将CSV文件读取到DataFrame
- JavaScript 代码收集
- 算法:Design Circular Deque(设计一个双端队列)
- BarTender数据批量打印软件的入门操作
- java算法训练 Interval
- 感悟较多影响较多的心理效应
- 台式机装苹果系统_AMD台式机装苹果系统!!
- 从未见过如此可笑的白领标准_独木桥的博客_雅虎博客_雅虎空间
- 双线双IP服务器架设传奇SF图文教程