Java多线程的几种创建方式
方法一:继承Thread类,重写run方法,直接调用start方法开启线程。
/**
* 继承Thread类,直接调用start方法开启线程。
* @author LuRenJia
*/
public class LeaningThread extends Thread {
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("可是这和我是一个冷酷的复读机又有什么关系呢?");
}
} public static void main(String[] args) {
LeaningThread Lt = new LeaningThread();
Lt.start();
}
}
方法二:实现Runable接口,重写run方法,通过Thread类调用start开启线程。
/**
* 实现Runnable接口来实现多线程,通过代理
* @author LuRenJia
*/
public class LeaningRunnable implements Runnable {
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("可是这和我是一个冷酷的复读机又有什么关系呢?");
}
}
public static void main(String[] args) {
new Thread(new LeaningRunnable()).start();
}
}
方法三:实现Callabler接口,重写call方法,通过ExecutorService类创建服务,调用其submit方法开启线程,通过其shutdown方法关闭服务。
/**
* 实现Callable接口来实现多线程
* @author LuRenJia
*/
public class LeaningCallable implements Callable<String> {
private String name; public LeaningCallable(String name) {
this.name = name;
} // 重写call方法,线程执行的内容,返回值通过get方法获取
@Override
public String call() throws Exception {
for (int i = 0; i < 20; i++) {
System.out.println(name + ":" + "可是这和我是一个冷酷的复读机又有什么关系呢?");
}
return name;
} public static void main(String[] args) {
LeaningCallable lc1 = new LeaningCallable("线程一");
LeaningCallable lc2 = new LeaningCallable("线程二");
LeaningCallable lc3 = new LeaningCallable("线程三"); // 创建执行服务
ExecutorService server = Executors.newFixedThreadPool(3); // 提交执行
Future<String> result1 = server.submit(lc1);
Future<String> result2 = server.submit(lc2);
Future<String> result3 = server.submit(lc3); try {
String temp = result1.get();// 获取返回值
System.out.println("返回值是:" + temp);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
// 关闭服务
server.shutdown();
}
}
快捷创建:使用lambda表达式快速创建简单线程。
/**
* lambda表达式:父类接口中只有一个方法待实现时,可以使用lambda表达式简化代码
* 1.标准形式:
* ()->{
*
* }
* 2.等价于一个实现了接口的之、子类。
*
* Thread类实现了Runnable接口,且此接口只有一个run方法待实现。
* @author LuRenJia
*
*/
public class LeaningLambda2 { public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
for(int i =0;i<100;i++) {
System.out.println("可是这和我是一个冷酷的复读机又有什么关系呢?");
} }
}).start(); //使用lambda表达式快速创建简单线程
new Thread(()->{
for(int i =0;i<100;i++) {
System.out.println("这触及到我的知识盲区了!");
}
}).start();
}
}
Java多线程的几种创建方式的更多相关文章
- java多线程的两种创建方式
方式一:继承Thread类 1.创建一个继承于Thread类的子类 2.重写Thread类的run()方法---> 将此线程执行的操作声明在run()中 3.创建Thread类的子类的对象 4. ...
- Java多线程的三种实现方式
java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...
- java多线程的几种实现方式
java多线程的几种实现方式 1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target3.通 ...
- 阿里巴巴--java多线程的两种实现方式,以及二者的区别
阿里巴巴面试的时候,昨天问了我java面试的时候实现java多线程的两种方式,以及二者的区别当时只回答了实现线程的两种方式,但是没有回答上二者的区别: java实现多线程有两种方式: 1.继承Thre ...
- java中多线程的两种创建方式
一丶继承Thread类实现多线程 第一步:继承Thread类第二步:重写run()方法第三步:创建继承了Thread类的对象 , 调用start()方法启动. //线程创建方式一 : /* 第一步:继 ...
- Java多线程学习(二)---线程创建方式
线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...
- Java多线程的两种实现方式
Java总共有两种方式实现多线程 方式1:通过继承Thread类的方式 package com.day04; /** * 通过继承Thread类并复写run方法来是实现多线程 * * @author ...
- java线程的3种创建方式及优缺点
线程创建简介 1.在java中表示线程的是Thread类.无论是那种方式创建线程,本质上都是创建Thread类的对象. 2.Thread类继承Runnable接口,且也有以Runnable作为参数的构 ...
- java 多线程编程三种实现方式
一种是继承Thread类,一种是实现Runable接口,还有一种是实现callable接口: 有博主说只有前面2种方式,我个人愚见是三种,主要详细介绍下callable的使用: 三种线程的我的个人理解 ...
随机推荐
- [BZOJ3625][CF438E]小朋友和二叉树 (多项式开根,求逆)
题面 题解 设多项式的第a项为权值和为a的二叉树个数,多项式的第a项表示是否为真,即 则,所以F是三个多项式的卷积,其中包括自己: ,1是F的常数项,即. 我们发现这是一个一元二次方程,可以求出,因为 ...
- C# Parallel类For循环与普通For循环耗时性能比较
1 static void Main(string[] args) 2 { 3 var dt = DateTime.Now; 4 var rand = new Random(DateTime.Now. ...
- python 作用域与命名空间
作用域 作用域分为: 全局作用域 局部作用域 在函数内部的作用域叫做局部作用域,局部作用域中的变量叫做局部变量 非函数内部的作用域叫做全局作用域,全局作用域中的变量叫做全局变量 局部作用域可以使用全局 ...
- Java 异步编程 (5 种异步实现方式详解)
同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现@mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Comp ...
- 5.监控MySQL
prometheus监控MySQL需要用到mysql_exporter. mysql_exporter 项目地址:https://github.com/prometheus/mysqld_export ...
- vue中的v-if查找数组中最后一个,给他加上新的样式
vue: var app=new Vue({ el:".xiaomi", data: { typeInfo: [{img:"image/type/phone_1.webp ...
- Python(一)转义字符及操作符
转义字符 描述 \(在行尾时) 续航符 \\ 反斜杠符号 \' 单引号 \'' 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n 转行 \v 纵向制表符 \t 横向 ...
- NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)
题目: A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...
- WhereIf 扩展
public static class QueryableExtensions { public static IQueryable<T> WhereIf<T>(this IQ ...
- Linux、Windows下Redis的安装即Redis的基本使用详解
前言 什么是Redis Redis是一个基于内存的key-value结构数据库.Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母 ...