多线程的三种创建方法

继承Thread类
子类继承Thread类具备多线程能力
启动线程:子类对象. start()

实现接口Runnable
启动线程:传入目标对象+ Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

实现Callable接口
1.实现Callable接口,需要返回值类型
2.重写call方法,需要抛出异常
3.创建目标对象
4.创建执行服务: ExecutorService ser = Executors.newFixedThreadPool(1);
5.提交执行: Future<Boolean> result1 = ser.submit(t1);
6.获取结果: boolean r1 = result1.get()
7.关闭服务: ser.shutdownNow();
使用Callable接口好处:
1、可以定义返回值
2、可以抛出异常
//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
//注意,线程开启不一定立即执行,由CPU调度执行
public class ThreadTest extends Thread{
public void run(){
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("run方法");
}
}
public static void main(String[] args) {
//main线程,主线程
//创建一个线程对象
ThreadTest threadTest = new ThreadTest();
threadTest.run();//调用start方法,同时执行,调用run方法,顺序执行
for (int i = 0; i < 20; i++) {
System.out.println("主线程");
}
}
}

//创建线程方式二:实现Runnable接口,重写run()方法,执行线程需要丢入Runnable实现类接口,调用Start方法
public class ThreadTest1 implements Runnable {
public void run(){
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("run方法");
}
}
public static void main(String[] args) {
//创建Runnable线程接口的实现类对象
ThreadTest1 threadTest1 = new ThreadTest1();
//创建线程对象,通过线程对象来开启我们的线程,代理
new Thread(threadTest1).start();
for (int i = 0; i < 20; i++) {
System.out.println("主线程");
}
}
}

import java.util.concurrent.*;

//线程创建方法三,实现Callable接口
public class CallableTest implements Callable<Boolean> {
private String s;

public CallableTest(String s) {
this.s=s;
}
@Override
public Boolean call(){//重写call方法
System.out.println(s);
return true;
}

public static void main(String[] args) throws ExecutionException, InterruptedException {
CallableTest c1 = new CallableTest("1");
CallableTest c2 = new CallableTest("2");
CallableTest c3 = new CallableTest("3");
CallableTest c4 = new CallableTest("4");
CallableTest c5 = new CallableTest("5");
CallableTest c6 = new CallableTest("6");
//创建执行服务:
ExecutorService ser = Executors.newFixedThreadPool(6);
//提交执行:
Future<Boolean> r1 = ser.submit(c1);
Future<Boolean> r2 = ser.submit(c2);
Future<Boolean> r3 = ser.submit(c3);
Future<Boolean> r4 = ser.submit(c4);
Future<Boolean> r5 = ser.submit(c5);
Future<Boolean> r6 = ser.submit(c6);
//获取结果:
boolean rs1 = r1.get();
boolean rs2 = r2.get();
boolean rs3 = r3.get();
boolean rs4 = r3.get();
boolean rs5 = r3.get();
boolean rs6 = r3.get();
//7. 关闭服务:
ser.shutdownNow();
}
}
posted @ 2022-05-13 17:56  优雅的程序猿  阅读(329)  评论(0)    收藏  举报