在java创建线程结果_Java创建线程的三种方式
1.继承Thread,并重写run()方法,重写run方法,该方法是线程执行体
public class MyThread extends Thread{
int i=0;
@Override
public void run() {
for (; i < 100; i++) {
System.out.println(getName() + ":" + i);
}
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
if (i == 20) {
new MyThread().start();
new MyThread().start();
}
}
}
}
2.通过Runable去创建线程,也是重写run方法,该方法是线程执行体
public class MyRunnable implements Runnable {
private int i=0;
@Override
/**
* 重写run方法,该方法同样是该线程的线程执行体
*/
public void run() {
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
if (i == 20) {
MyRunnable runnable = new MyRunnable();
//该Thread对象才是真正的线程对象.
new Thread(runnable, "新线程-1").start();
new Thread(runnable, "新线程-2").start();
}
}
}
}
执行结果部分结果:
新线程-2:80
新线程-1:81
新线程-2:82
新线程-1:83
新线程-2:84
新线程-1:85
新线程-2:86
新线程-1:87
新线程-2:88
新线程-1:89
新线程-2:90
新线程-1:91
新线程-2:92
新线程-1:93
新线程-2:94
新线程-1:95
新线程-2:96
新线程-1:97
新线程-2:98
新线程-1:99
可以看出线程1和线程2共享了MyRunnable实例对象的i。
3.通过Callable和Future创建线程,通过继承Thread和Runable创建的线程,在线程执行完成之后无法获取执行结果。
如果需要获取线程执行结果,就需要通过共享变量或者是线程通信的方法来达到效果,使用起来比较麻烦。
通过重写Callable接口中的call()方法,该方法是有返回值的,Future可以得到线程执行完成之后的结果值。
public class MyCallable implements Callable {
@Override
/**
* 重写call方法,即为线程的执行体
*/
public Integer call() throws Exception {
int i = 0;
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
return i;
}
public static void main(String[] args) {
//获取实习callable接口的类的实例
MyCallable callable = new MyCallable();
//使用FutureTask类来包装Callable对象,
// 该FutureTask对象封装了该Callable对象的call()方法的返回值。
FutureTask task = new FutureTask<>(callable);
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
if (i == 20) {
new Thread(task, "有返回值的线程").start();
try {
System.out.println("子线程的返回值:" + task.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}
}
三种创建线程方式比较:
1)实现Runnable和Callable接口,还可以继承其他类,继承了Thread类就不能集成其他类型。
2)继承Thread类编程比较简单,如果要访问当前线程,可以直接使用this指针得到,如果是实现Runnable和Callable接口,要使用Thread.currentThread()方法得到当前线程
3)实现Runnable和Callable接口时,多个线程可以共享一个实现Runnable和Callable接口类的实例变量,但是如果继承Thread类的话,每一个线程都要新建一个实例对象。
4)实现Callable接口,允许线程执行完成之后,返回执行结果。
在java创建线程结果_Java创建线程的三种方式相关推荐
- java tostring格式化日期_Java格式化日期的三种方式
1)借助DateFormat类: public String toString(Date d) { SimpleDateFormat sdf = new SimpleDateFormat(" ...
- java的依赖注入_Java依赖注入的三种方式
Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:组织方式注入,setter注入,基于注解的注入. 组织方式注入 组织器注入:保证了一些需要的属性在Bean实例化时就设 ...
- JS基础-Java Class类以及获取Class实例的三种方式
JS基础-Java Class类以及获取Class实例的三种方式 由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名.包名.父类.实现的接口. ...
- java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)
Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...
- java 读取css文件_java文件读取的两种方式
JAVA中读取文件(二进制,字符)内容的几种方 JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代 ...
- java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...
尽管Java提供了一个可以处理文件的IO操作类. 但是没有一个复制文件的方法. 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候. 然而有几种方法可以进行Java文件复制操作,下面列举出 ...
- java时间戳是什么类型_java 获取时间戳的三种方式
java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMill ...
- java实现多线程抢单_JAVA实现多线程的四种方式
JAVA多线程实现方式: 1.继承Thread类(无返回值) 2.实现Runnable接口(无返回值) 3.实现Callable接口,通过FutureTask包装器来创建Threak线程(有返回值) ...
- java多线程的实现方式_JAVA多线程实现的三种方式
最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结. 1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用E ...
- java map 迭代遍历_java 遍历Map的四种方式
java 遍历Map的四种方式 CreationTime--2018年7月16日16点15分 Author:Marydon 一.迭代key&value 第一种方式:迭代entrySet 1.方 ...
最新文章
- Python 技术篇-用PIL库修改图片透明度实例演示,改变png图片色道为RGBA、RGB
- 最好的电脑系统_热键被占用怎么办?电脑系统 程序 游戏热键被占用冲突如何解决?...
- 【Minimum Depth of Binary Tree】cpp
- 深度学习基础知识介绍
- MySQL错误1264和1366_Mysql错误1366 - Incorrect integer value解决方法
- Vuejs:组件 slot 内容分发
- 注释那些事儿:前端代码质量系列文章(一)
- emq数据储存到mysql,规则引擎示例 - 保存数据到 MySQL - 《EMQ X Enterprise v4.0 中文文档》 - 书栈网 · BookStack...
- 6.跑步者--并行编程框架 ForkJoin
- 源码时代html考试题,源码时代老师详解Web前端开发的三要素
- Android常用应用市场包名
- web安全工具介绍(漏洞扫描、信息收集、提升权限的网站、app)持续更新
- 板载天线设计相关资料
- 计算机c盘能备份数据吗,怎么备份C盘数据
- 内存管理_分代机制(年轻代、年老代、永久代)
- Linux系统中errno对应的中文意思 errno.h
- 安卓与苹果盒子与h5相互调用,js,vue
- 迷宫求解【穷举求解法】
- 同样的程序每次运行的时间不一样
- Linux查看磁盘使用情况
热门文章
- 个人Web自动化测试学习点总结
- Java用WebSocket + tail命令实现Web实时日志
- length属性,length()方法和size()的方法的区别
- SCVMM 2012 R2---添加Hyper-V虚拟机
- 收藏一篇关于 用两个栈实现一个队列功能的帖子
- 在.net中使用sqlite
- java抽象类可以new_java的抽象类,接口,普通类是否可以直接NEW,并且复写方法?
- Git - 命令行 - 使用 Tag 标记你的代码
- ISIS出现(Project2.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.)异常
- matlab模式识别大作业_史上最萌最认真的机器学习/深度学习/模式识别入门指导手册(二)...