欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

线程使用总结:创建线程的三种方法

程序员文章站 2022-04-15 17:59:20
继承Thread类:子类继承Thread类具备多线程能力启动线程:子类对象.start()不建议使用:避免OOP单继承局限性public class ThreadDemo2 extends Thread { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println(Thread.currentThread().getName()....

线程使用总结:创建线程的三种方法

继承Thread类:

  • 子类继承Thread类具备多线程能力
  • 启动线程:子类对象.start()
  • 不建议使用:避免OOP单继承局限性
public class ThreadDemo2 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName() + "我在吃饭" + i);
        }
    }

    public static void main(String[] args) {
        ThreadDemo2 threadDemo = new ThreadDemo2();
        threadDemo.setName("耿爽");
        threadDemo.start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("我在学习多线程" + i);
        }
    }
}

输出结果为:
线程使用总结:创建线程的三种方法
注意:线程开启,并不一定立刻执行,由cpu调度执行
实现Runnable接口:

  • 实现接口Runnable具有多线程能力
  • 启动线程:传入目标对象+Thread对象.start()
  • 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用。
public class ThreadDemo implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "我在吃饭" + i);
        }
    }

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            System.out.println("我在学习多线程");
            Runnable runnable = new ThreadDemo();
            Thread thread = new Thread(runnable, "耿爽");
            thread.start();
        }
    }
}

线程使用总结:创建线程的三种方法
其实不管是通过继承Thread类还是通过实现Runable接口来实现线程,最终都是通过Thread类的对象的API来控制线程(代理设计模式)。
源码:
线程使用总结:创建线程的三种方法
Thread类本质上也是实现了Runnable接口,启动线程的唯一方法就是通过Thread类的start()方法。start()方法是一个native(本地)方法,它将启动一个新线程,并执行run()方法(Thread类中提供的run()方法是一个空方法)。

实现Callable接口

Runnable和Callable的区别

  1. Callable规定的方法是 call(), Runnable规定的方法是 run()。
  2. Callable的任务执行后可返回值,而 Runnable的任务是不能返回值。
  3. call方法可以抛出异常, run方法不可以。
  4. 运行 Callable任务可以拿到一个 Future对象
  5. 在实现接口时,Callable后又对尖括号中间还有个T,如:,这就是泛型,里面尖括号填写你的返回值的类型:
public class ThreadDemo3 implements Callable<Integer> {
    private int i;

    @Override
    public Integer call() throws Exception {
        for (; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "我在吃饭" + i);
        }
        return i;
    }

    public static void main(String[] args) {
        Callable<Integer> callable = new ThreadDemo3();
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+"我在学习多线程"+i);
            Thread thread = new Thread(futureTask, "耿爽");
            thread.start();
        }
    }
}

实现结果为:
线程使用总结:创建线程的三种方法

本文地址:https://blog.csdn.net/weixin_45371171/article/details/110247238

相关标签: 学习文档 java