当前位置:网站首页>2. Thread creation
2. Thread creation
2022-08-09 09:32:00 【come here my bear】
线程创建
三种创建方式:
- Thread class(继承Thread类)
- 自定义线程类继承Thread类
- 重写run() 方法,编写线程执行体
- 创建线程对象,调用start() 方法启动线程
- Runnable接口(实现Runnable接口)
- 定义MyRunnable类实现Runnable接口
- 实现run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
- Callable接口(实现Callable)
- 重写Callable接口,需要返回值类型
- 重写call方法,需要抛出异常
- 创建目标对象
- 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
- 提交执行:Future result1 = ser.sbumit(t1);
- 获取结果:boolean r1 = result1.get();
- 关闭服务:ser.shutdownNow();
推荐使用Runnable对象,因为JavaAre the limitations of single inheritance
继承Thread类
- 自定义线程类继承Thread类
- 重写run() 方法,编写线程执行体
- 创建线程对象,调用start() 方法启动线程
注:线程不一定执行,由CPU调度执行
package com.xiancheng.demo;
/**
* 创建线程方式一:
* 继承Thread类,
* 重写run()方法
* 调用start()开启线程
*/
public class TestThread extends Thread{
public static void main(String[] args) {
// main线程,主线程
// 创建一个线程对象
TestThread thread = new TestThread();
// 调用start()方法开启线程
thread.start(); // start()多条执行路径,主线程和子线程并行交替执行
// thread.run(); // run() 只有主线程一条执行路径
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程--" + i);
}
}
// 线程入口点
@Override
public void run() {
// run() 方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在写代码--" + i);
}
}
}
实现Runnable接口
- 定义MyRunnable类实现Runnable接口
- 实现run()方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
package com.xiancheng.demo;
// 创建线程方法
// 实现Runnable接口.重写run()方法,执行线程需要丢入runnable接口实现类,调用start()方法启动线程
public class TestThread3 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("我在写代码");
}
}
public static void main(String[] args) {
TestThread3 testThread3 = new TestThread3();
// Thread thread = new Thread(testThread3);
// thread.start();
new Thread(testThread3).start();
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程");
}
}
}
Callable接口
- 重写Callable接口,需要返回值类型
- 重写call方法,需要抛出异常
- 创建目标对象
- 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
- 提交执行:Future result1 = ser.sbumit(t1);
- 获取结果:boolean r1 = result1.get();
- 关闭服务:ser.shutdownNow();
package com.xiancheng.demo2;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
// 实现Callable接口
/*
实现Callable接口的好处:
可以有返回值
可以抛出异常
*/
public class TestCallable implements Callable<Boolean> {
private String url;
private String filename;
public TestCallable(){
}
public TestCallable(String url, String filename){
this.url = url;
this.filename = filename;
}
@Override
public Boolean call() throws Exception {
WebDownloader downloader = new WebDownloader();
downloader.downloader(url,filename);
System.out.println("下载的文件名为:" + filename);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable callable = new TestCallable("https://tse2-mm.cn.bing.net/th/id/OIP-C.2rQ25qnSMQHXGcHz3Rp2pAHaEo?w=277&h=180&c=7&r=0&o=5&dpr=1.25&pid=1.7","2,jpg");
// 创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(1);
// 提交执行
Future<Boolean> future = ser.submit(callable);
// 获取结果
System.out.println(future.get());
// 关闭服务
ser.shutdownNow();
}
}
class WebDownloader{
public void downloader(String url, String file){
try {
FileUtils.copyURLToFile(new URL(url),new File(file));
} catch (IOException e) {
e.printStackTrace();
}
}
}
小结
继承Thread类
- 子类继承Thread类具备多线程能力
- 启动线程:子类对象.start()
- 不建议使用:避免OOP单继承局限性
实现Runnable接口
- 实现接口Runnale具备多线程能力
- 启动线程:传入目标对象+Thread对象+start()
- 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
实现Callable接口的好处
- 可以定义返回值
- 可以抛出异常
边栏推荐
猜你喜欢
字典
常用功能测试的检查点与用例设计思路
Summary of steps and methods for installing and uninstalling test cases that you must read
列表
Understanding of PID control motor output as motor PWM duty cycle input
MySQL Checking and Filling Leaks (5) Unfamiliar Knowledge Points
年薪40W测试工程师成长之路,你在哪个阶段?
软件测试的流程规范有哪些?具体要怎么做?
本体开发日记05-努力理解SWRL(中)
迭代
随机推荐
Go-控制语句那些事
选择黑盒测试用例设计方法的综合策略方案总结
MySQL Leak Detection and Filling (2) Sorting and Retrieval, Filtering Data, Fuzzy Query, Regular Expression
黑盒测试常见错误类型说明及解决方法有哪些?
3.编码方式
Environment build onnxruntime 】
makefile学习-解决目标文件输出路径问题
2048小游戏成品源码
恶意软件查杀工具分享
接口测试的基础流程和用例设计方法你知道吗?
8.Properties property collection
接口测试主要测试哪方面?需要哪些技能?要怎么学习?
3.List接口与实现类
unittest测试框架原理及测试流程解析,看完绝对有提升
2.线程创建
性能测试包括哪些方面?分类及测试方法有哪些?
本体开发日记05-努力理解SWRL(Built-Ins)
条件和递归
本体开发日记05-努力理解SWRL(中)
Ovie map computer terminal and mobile terminal can not be used, is there any alternative map tool