线程创建的三种方法:继承Thread类,实现Runnable接口,实现Callable接口
线程创建
三种创建方式

1. 继承Thread类
- 自定义线程类继承Thread类
- 重写run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
线程不一定执行,CPU按排调度
package multithreading;
// 创建线程方式一:继承Thread类,重写run()方法,调用start()开启线程
// 总结:注意,线程开启不一定立即执行,由CPU调度安排
public class TestThread1 extends Thread {
@Override
public void run() {
// run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码---"+i);
}
}
public static void main(String[] args) {
// main线程,主线程
// 创建一个线程对象
TestThread1 testThread1 = new TestThread1();
// 调用start()方法开启线程
testThread1.start();
for (int i = 0; i < 2000; i++) {
System.out.println("我在学习多线程---"+i);
}
}
}
调用start()先执行主线程中内容
调用run()主线程先执行run方法中内容

2. 实现Runnable接口
package multithreading;
// 创建线程方法2:实现Runnable接口,重写run()方法,执行线程需要丢入Runnable接口的实现类
public class TestThread3 implements Runnable{
@Override
public void run() {
// run方法线程体
for (int i = 0; i < 200; i++) {
System.out.println("我在看代码---"+i);
}
}
public static void main(String[] args) {
// 创建runnable接口的实现类对象
TestThread3 testThread3 = new TestThread3();
// 创建线程对象,通过线程对象来开启线程,代理
Thread thread = new Thread(testThread3);
thread.start();
// new Thread(testThread3).start();
for (int i = 0; i < 2000; i++) {
System.out.println("我在学习多线程---"+i);
}
}
}
Thread && Runnable
继承Thread类
- 子类继承Thread类具备多线程能力
- 启动线程:子类对象.start()
- 不建议使用:避免OOP单继承局限性
实现Runnable接口
- 实现接口Runnable具有多线程能力
- 启动线程:传入目标对象+Thread对象.start()
- 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

3. 实现Callable接口(了解)
实现Callable接口,需要返回值
重写call方法,需要抛出异常
创建目标对象
创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(3);
提交执行:Future result1 = ser.submit(t1);
获取结果:boolean rs1 = result1.get();
关闭服务:ser.shutdownNow();
演示:利用Callable改造图片下载案例
package multithreading;
import java.util.concurrent.*;
// 创建线程方式三:实现Callable接口
// 使用Callable的好处:1.可以定义返回值 2.抛出异常
public class TestCallable implements Callable<Boolean> {
private String url; // 网络图片地址
private String name; // 保存的文件名
public TestCallable(String url,String name){
this.url = url;
this.name = name;
}
// 下载图片线程的执行体
@Override
public Boolean call() throws Exception {
WebDownLoader webDownLoader = new WebDownLoader();
webDownLoader.downloader(url,name);
System.out.println("下载了文件名为:"+name);
return true;
}
public static void main(String[] args) throws ExecutionException,InterruptedException { // 抛出异常
TestCallable t1 = new TestCallable("https://img-pre.ivsky.com/img/tupian/pre/202012/23/youshan_yingguo_lanse_duanmaomao-003.jpg","cat1.jpg");
TestCallable t2 = new TestCallable("https://img-pre.ivsky.com/img/tupian/pre/202012/23/youshan_yingguo_lanse_duanmaomao-002.jpg","cat2.jpg");
TestCallable t3 = new TestCallable("https://img-pre.ivsky.com/img/tupian/pre/202012/23/youshan_yingguo_lanse_duanmaomao-005.jpg","cat3.jpg");
// 创建执行服务,线程池:
ExecutorService ser = Executors.newFixedThreadPool(3);
// 提交执行:
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3);
// 获取结果:
boolean rs1 = r1.get();
boolean rs2 = r2.get();
boolean rs3 = r3.get();
System.out.println(rs1); // 打印返回值
System.out.println(rs2);
System.out.println(rs3);
// 关闭服务:
ser.shutdownNow();
}
}
执行结果:

线程创建的三种方法:继承Thread类,实现Runnable接口,实现Callable接口的更多相关文章
- c++11线程创建的三种方法
一.用一个初始函数创建一个线程 直接看代码:注意c++在运行一个可执行程序的时候(创建了一个进程),会自动的创建一个主线程,这个主线程和进程同生共死,主线程结束,进程也就结束了. #include & ...
- JAVA之线程同步的三种方法
最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchroni ...
- java多线程二之线程同步的三种方法
java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Se ...
- AJPFX总结线程创建的两种方法
创建线程的第一种方式:继承Thread ,由子类复写run方法.步骤:1,定义类继承Thread类:2,目的是复写run方法,将要让线程运行的代码都存储到run方法中:3,通过创建Thread类的子类 ...
- java_线程创建的两种方法
线程创建的方法有两种: 一 继承Thread类: public class ThreadTest { public static void main(String[] args) { //4)在mai ...
- 实现多线程的三种方法:Thread、Runnable和Callable
继承Thread类,重写run()方法 步骤: (1) 定义类继承Thread类 (2) 复写Thread类中的run方法. (3) 调用线程的start方法 (start方法有两种含义:1. 启动多 ...
- JavaScript高级程序设计--对象创建的三种方法
创建对象的三种方法: 1.工厂模式 工厂模式是软件工程领域广为人知的设计模式,这种模式抽象了创建具体对象的过程.下面是使用工厂函数创建对象的的一个例子. 2.构造函数: 从上面的例子中,我们看到构造函 ...
- Java中实现线程同步的三种方法
实现同步的三种方法 多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步. 实现同步的三种方法: 使用同步代码块 使用同步方法 使用互斥锁ReetrantLock(更灵活的代码控制) 代码 ...
- java_线程创建的三种方式及区别
java中关于线程的创建有三种: (1)通过继承Thread类创建线程. (2)通过实现Runnable接口创建线程. (3)通过Callable 和 Future 接口创建线程. * * * * * ...
随机推荐
- Docker入门与进阶(上)
Docker入门与进阶(上) 作者 刘畅 时间 2020-10-17 目录 1 Docker核心概述与安装 1 1.1 为什么要用容器 1 1.2 docker是什么 1 1.3 docker设计目标 ...
- 精尽Spring Boot源码分析 - Condition 接口的扩展
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 利用C语言将混乱数字排序(即冒泡排序法)(含思路)
大一C语言 你没学过吗 这篇可以称的上入门级别的c语言了 当然还有水仙花数,冒泡排序等经典的C语言程序 后面也会逐一更新 尽情期待喔~~~ 冒泡排序法的基本思路为:每次将相邻的两个数比较,将小的调在前 ...
- Python分析【公众号】历史评论,看看大家的留言情况!
大家好,我是辰哥~~~ 辰哥玩公众号有一段时间了,这期文章分析一波读者的留言情况,不仅可以对公众号的各位铁粉一目了然,还可以通过分析的结果对公众号的经营进行更好的规划.如读者留言的内容通常是内容是什么 ...
- Redis:Java链接redis单节点千万级别数据 写入,读取 性能测试
本文是对Redis 单节点,针对不同的数据类型,做插入行测试. 数据总条数为:10058624 环境说明: Redis 未做任何优化, 单节点 (服务器上, 内存64G) ...
- WebService:WebService+Springboot常用注解
首先推荐webservice文章不错的博主:https://www.iteye.com/blog/yufenfei-1685249 这位博主主要讲了WebService的CXF的jar包运用,很实用 ...
- Codeforces Round #732 (Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1546 A. AquaMoon and Two Arrays 题意 给出两个大小为 \(n\) 的数组 \(a, b\) ,每 ...
- DEV-C++ 5.11格式化源代码设置
下载STYLEAStyle_3.1_windows.zip解压缩,复制到C:\Program Files (x86)\Dev-Cpp\AStyle以管理员身份打开dev-c++软件"工具&q ...
- Redis的持久化机制你学会了吗
大家都知道Redis经常被使用在缓存的场景中,那有没有想过这么一个问题,一旦服务器宕机,内存中的数据全部丢失,我们该如何进行恢复呢?如果直接从后端数据库恢复,不仅会给数据库带来巨大的压力,还会使上层应 ...
- Lesson2 Thirteen equals one
Lesson2 Thirteen equals one equal ['i:kwəl] v. 等于 He equaled the world record. Nobody equals him i ...