创建方式
有三种:1.继承Thread类,2.实现Runnable接口,3.实现Callable接口
1.继承Thread类
用类来继承Thread类并且重写其中的run方法,再调用start方法来开启线程。
//创建线程方式一:继承Thread类,重写Run()方法,调用Start()开启线程
//线程开启不一定立即执行,由cpu调度。
public class Text extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0;i < 10;i ++){
System.out.println("我在看代码"+i);
}
}
public static void main(String[] args) {
//创建一个线程对象
Text test = new Text();
//调用start方法开启线程,看代码和学习交替输出,线程同时运行,如果该处是run方法则先输出看代码,再到学习
test.start();
//main线程
for (int i = 0;i < 20;i ++){
System.out.println("我在学习"+i);
}
}
}
不推荐使用:避免OOP单继承的局限性
2.实现Runnable接口
用类来实现runnable接口,并且重写接口中的run方法,再在主方法中创建该类的对象,再创建Thread线程类对象,将实现runnable接口的对象作为参数传入Thread线程类对象,再让Thread线程类对象调用start方法来启动线程。
//创建线程方式2:实现Runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法
public class SetMethod2 implements Runnable{
@Override
public void run() {
//run方法线程体
for (int i = 0;i < 10;i ++){
System.out.println("我在看代码"+i);
}
}
public static void main(String[] args) {
//创建一个runnable接口的实现类对象
SetMethod2 setMethod2 = new SetMethod2();
//就是要将runnable接口的实现类对象作为参数传入Thread类对象里面,再调用Thread类对象调用start
//创建线程对象,通过线程对象来开启我们的线程,代理
//Thread thread = new Thread(setMethod2);
//thread.start();
//Thread类对象在此作为一个代理
new Thread(setMethod2).start();
for (int i = 0;i < 20;i ++){
System.out.println("我在学习"+i);
}
}
}
推荐使用:避免单继承的局限性,灵活方便,方便同一个对象被多个线程使用
3.实现Callable接口
1.实现Callable接口,需要返回值类型
2.重写call方法,需要抛出异常
3.创建目标对象
4.创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1); //创建线程池
5.提交执行:Future result1 = ser.submit(t1)
6.获取结果:boolean r1 = result1.get();
7.关闭服务: ser.shutdownNow();
代入网图下载的案例(结合下文网图下载案例来看)
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
//好处:
//1.可以定义返回值
//2.可以抛出异常
public class SetMethod3 implements Callable<Boolean> {
private String url;
private String name;
public SetMethod3(String url,String name){
this.url = url;
this.name = name;
}
//下载图片线程的执行体
@Override
public Boolean call() {
WebDownLoader webDownLoader = new WebDownLoader();
webDownLoader.downloader(url,name);
System.out.println("下载文件名为"+name);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
SetMethod3 t1 = new SetMethod3("https://dgss2.bdstatic.com/5bVYsj_p_tVS5dKfpU_Y_D3/data/5da01018afc3ffb13aaf8f0e34d23f0c","2.jpg");
SetMethod3 t2 = new SetMethod3("https://dgss2.bdstatic.com/5bVYsj_p_tVS5dKfpU_Y_D3/data/5da01018afc3ffb13aaf8f0e34d23f0c","3.jpg");
SetMethod3 t3 = new SetMethod3("https://dgss2.bdstatic.com/5bVYsj_p_tVS5dKfpU_Y_D3/data/5da01018afc3ffb13aaf8f0e34d23f0c","4.jpg");
//创建执行任务
ExecutorService ser = Executors.newFixedThreadPool(3);//newFixedThreadPool代表线程池,里面有三个线程
//提交执行
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();
//关闭服务
ser.shutdownNow();
}
//下载器
class WebDownLoader{
//下载方法
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));//将网页地址的图片变成一个文件
} catch (IOException e) {
e.printStackTrace();
System.out.println("io异常,download方法出现异常");
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84205.html