多线程的三种实现方式

67 阅读2分钟

🍍1.1继承Thread类(重要)

自定义线程类继承Thread

重写run()方法,编写线程执行体

创建线程对象,调用start()方法启动线程 public class Demo1_CreateThread1 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线程,上线程
    //创建一个线程对象
    Demo1_CreateThread1 testThread = new Demo1_CreateThread1();
    //调用start()开启线程
    testThread.start();
    for (int i = 0; i < 200; i++) {
        System.out.println("我在学习多线程----" + i);
    }
}
}

🍍1.2实现Runnable接口

推荐使用Runnable对象,因为Java单继承的局限性

自定义线程类实现Runnable接口

实现run()方法,编写线程执行体

创建线程对象,调用start()方法启动对象 public class Demo3_CreateRunnable implements Runnable {

@Override
public void run() {
    //run方法线程体
    for (int i = 0; i < 20; i++) {
        System.out.println("我在看代码----" + i);
    }
}

public static void main(String[] args) {
    //创建runnable接口的实现类对象
    Demo3_CreateRunnable testThread = new Demo3_CreateRunnable();
    //创建线程对象,通过线程对象来开启我们的线程,代理
    Thread thread = new Thread(testThread);
    //调用start()开启线程
    thread.start();

    //new Thread(testThread).start();
    for (int i = 0; i < 200; i++) {
        System.out.println("我在学习多线程----" + i);
    }
}
}

🍍1.3实现Callable接口(了解) 实现Callable接口,需要返回值类型

重写call方法,需要抛出异常

创建目标对象

创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);

提交执行:Future result1 = ser.submit(11);

获取结果:boolean r1 = result1.get()

关闭服务:ser.shutdownNow(); `/**

  • 实现Callable接口 */ public class Demo6_CreateCallable implements Callable {
private String url;//网络图片地址
private String name;//报错扥文件名

//有参构造
public Demo6_CreateCallable(String url, String name) {
    this.url = url;
    this.name = name;
}

//下载图片线程的执行体
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 {
    Demo6_CreateCallable c = new Demo6_CreateCallable("https://img-home.csdnimg.cn/images/20201124032511.png", "1.png");
    Demo6_CreateCallable c1 = new Demo6_CreateCallable("https://img-home.csdnimg.cn/images/20201124032511.png", "2.png");
    Demo6_CreateCallable c2 = new Demo6_CreateCallable("https://img-home.csdnimg.cn/images/20201124032511.png", "3.png");
    //创建执行服务
    ExecutorService ser = Executors.newFixedThreadPool(3);
    //提交执行
    Future<Boolean> r = ser.submit(c);
    Future<Boolean> r1 = ser.submit(c1);
    Future<Boolean> r2 = ser.submit(c2);
    //获取结果
    boolean res = r.get();
    boolean res1 = r1.get();
    boolean res2 = r2.get();
    //关闭服务
    ser.shutdownNow();
}
}
好处

可以定义返回值 可以抛出异常

继承Thred类:

子类继承Thread类具备多线程能力 启动线程:子类对象.start() 不建议使用:避免OOP单继承局限性 实现Runnable接口

实现接口Runnable具有多线程能力

启动线程:传入目标对象+Thread对象.start()

推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用