Java多线程-----创建线程的几种方式
1.继承Thread类创建线程
- 定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体
- 创建Thread子类的实例,也就是创建了线程对象
- 启动线程,即调用线程的start()方法
package com.practise.thread;
public class InheritThread extends Thread {
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
package com.practise.thread;
public class ThreadTest {
public static void main(String[] args) {
//线程类
InheritThread inheritThread = new InheritThread();
inheritThread.setName("线程一");//设置线程名称
inheritThread.start();
//主线程
Thread.currentThread().setName("主线程");
for (int i = 1; i <= 20; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
2.实现Runnable接口创建线程
- 定义Runnable接口的实现类,一样要重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体
- 创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象
- 调用线程对象的start()方法来启动线程
package com.practise.thread;
public class ImplementRunnable implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
package com.practise.thread;
public class ThreadTest {
public static void main(String[] args) {
//实现Runnable接口
ImplementRunnable implementRunnable=new ImplementRunnable();
Thread thread=new Thread(implementRunnable);
thread.setName("线程二");
thread.start();
//主线程
Thread.currentThread().setName("主线程");
for (int i = 1; i <= 20; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
3.使用Callable和Future创建线程
- 创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)
- 使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值
- 使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)
- 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
package com.practise.createthread;
import java.util.concurrent.Callable;
public class ImplementCallable implements Callable<Integer> {
@Override
public Integer call() {
Integer total = 0;
try {
for (int i = 1; i <= 50; i++) {
total += i;
}
return total;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}
package com.practise.createthread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThreadTest {
public static void main(String[] args) {
ImplementCallable implementCallable=new ImplementCallable();
FutureTask<Integer> task=new FutureTask<Integer>(implementCallable);
Thread thread=new Thread(task,"有返回值的线程");
thread.start();
try {
System.out.println(task.get());
} catch (Exception ex) {
ex.printStackTrace();
}
Thread.currentThread().setName("主线程");
for (int i = 1; i <= 20; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
Java多线程-----创建线程的几种方式的更多相关文章
- Java 多线程 创建线程的4种方式
1 继承Thread类,重写run方法.Thread类实现了Runnable接口. 2 实现Runnable接口,重写run方法.相比于继承Thread类,可以避免单继承的缺陷和实现资源共享. 举例: ...
- Java多线程——创建线程的两种方式
创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程 ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- Java中创建线程的两种方式
创建线程的第一种方式: 创建一个类继承Thread 重写Thread中的run方法 (创建线程是为了执行任务 任务代码必须有存储位置,run方法就是任务代码的存储位置.) 创建子类对象,其实就是在创建 ...
- Java值创建线程的两种方式对比
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...
- Java中创建线程的三种方式以及区别
在java中如果要创建线程的话,一般有3种方法: 继承Thread类: 实现Runnable接口: 使用Callable和Future创建线程. 1. 继承Thread类 继承Thread类的话,必须 ...
- Java中创建线程的三种方式及其优缺点
1.自定义一个继承Thread的类,由于Java的单继承特性,限制了该类的扩展性. 2.实现Runnable接口,重写run()方法. 3.实现Callable接口,重写call方法.线程执行体可以有 ...
- 【Java】创建线程对象两种方式
1.继承Thread类,重载run方法: Thread t = new Thread(new Runnable() { @Override public void run() { // TODO Au ...
- Java并发编程:Java创建线程的三种方式
目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...
随机推荐
- 如何在Win10上永久禁用Windows Defender Antivirus
1.使用Windows键+ R键盘快捷键打开运行命令. 2.键入regedit,然后单击确定以打开注册表. 3.浏览以下路径: HKEY_LOCAL_MACHINE/SOFTWARE/Policies ...
- Nginx之基本介绍(一)
这是一篇介绍Nginx基本信息和配置文件详情的文章,适合入门者,如果你想深入了解Nginx请绕道 什么是Nginx? Nginx是轻量级,高性能,跨平台的web服务器 Nginx的特点 更快 单个请求 ...
- sdram 裸机程序
硬件平台 :JZ2440 实现功能:将led闪烁代码从2440的2k sram中拷贝到sdram start.s --> 上电初始化,拷贝代码 sdram.c --> ...
- Nand Flash 裸机程序
硬件平台 :JZ2440 实现功能:初始化 Nand Flash 和 sdram,并将代码从 Nand Flash 拷贝到 sdram. start.s --> 上电初始化 nand ...
- javascript 实例 静态 公共 私有
传统 javascript 的原型对象 和 ts的类 对比 传统原型队形说明: //对象构造函数 function Atest(name) { //私有属性,只能在对象构造函数内部使用 var cla ...
- 1 认识开源性能测试工具jmeter
典型的性能测试工具主要有2个,Load Runner和jmeter.Load Runner是商业化的,Jmeter是开源的.下面我们认识一下开源性能测试工具jmeter. 1.jmeter是什么? A ...
- HP1020打印机“传递给系统调用的数据区域太小” 如何处理?
如果电脑上曾经安装过 HP LaserJet 激光打印机的驱动程序,重新安装驱动程序之前,需要完全卸载以前安装的驱动程序,否则可能会出现无法找到设备或者安装不上驱动程序的现象. 安装网站下载的即插即用 ...
- 搭建简单SBT工程实践
在本机jdk(主要配置环境变量).scala(主要配置环境变量).sbt(主要配置①私服repositories ②sbtconfig.txt)都已经安装且配置好的情况下. repositories ...
- Koala ===》编译工具 ==》Less和Sass
官网下载网址:http://koala-app.com/index-zh.html 安装时:必须装在c盘,否则会编译报错,切记要装在c盘使用,把整体目录拖动到软件中,执行编译(success)即可 整 ...
- QGL登陆wui 提示not possible
1: sap 登陆 QGL系统, 提示 2: 需要到该系统下,使用 T-CODE su01 或者 su3 对LIHANS1 用户角色进行修改. 3:su53 查询 自己操作的 历史纪录和 状 ...