Java-创建线程的三种方式

继承Thread

  • 1、定义一个类MyThread继承Thread,并重写run方法。
  • 2、将要执行的代码写在run方法中。
  • 3、创建该类的实例,并调用start()方法开启线程。
public class TestThread extends Thread {
    
    public static void main(String[] args) {
        //3、创建该类的实例,并调用start()方法开启线程。
        MyThread myThread = new MyThread();
        myThread.start();
    }
    
    //1、定义一个类MyThread继承Thread,并重写run方法。
    static class MyThread extends Thread {
        
        @Override 
        public void run() {
            //2、将执行的代码写在run方法中。
            for (int i = 0; i < 100; i++) {
                System.out.print("线程名字:" + Thread.currentThread().getName() + " i=" + i +"\n");
            }
        }
    }

}

实现Runnable接口

  • 1、定义一个类MyRunnable实现Runnable接口,并重写run方法。
  • 2、将要执行的代码写在run方法中。
  • 3、创建Thread对象, 传入MyRunnable的实例,并调用start()方法开启线程。
    代码如下:
public class TestThread extends Thread {

    public static void main(String[] args) {
        //3、创建Thread对象, 传入MyRunnable的实例,并调用start()方法开启线程。
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }

    //1、定义一个类MyRunnable实现Runnable接口,并重写run方法。
    static class MyRunnable implements Runnable {
        
        @Override        
        public void run() {
            //2、将执行的代码写在run方法中。
            for (int i = 0; i < 100; i++) {
                System.out.print("线程名字:" + Thread.currentThread().getName() + " i=" + i + "\n");
            }
        }
    }
}

实现Callable接口

public class TestThread extends Thread {

    public static void main(String[] args) {

        //3、创建线程池对象,调用submit()方法执行MyCallable任务,并返回Future对象
        ExecutorService pool = Executors.newSingleThreadExecutor();
        Future f1 = pool.submit(new MyCallable());

        //4、调用Future对象的get()方法获取call()方法执行完后的值
        // 注意,如果调用f1.get()方法,会阻塞主线程
        try {
            System.out.print("sum=" + f1.get() + "\n");
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        //关闭线程池
        pool.shutdown();

        for (int i = 0; i < 100; i++) {
            System.out.print("我是主线程的 i=" + i);
        }
    }

    //1、自定义一个类MyCallable实现Callable接口,并重写call()方法
    public static class MyCallable implements Callable {

        @Override
        public Integer call() throws Exception {

            //2、将要执行的代码写在call()方法中
            int sum = 0;
            for (int i = 0; i <= 100; i++) {
                sum += i;
                Thread.sleep(100);
            }
            return sum;
        }
    }

}

创建线程的三种方式对比

继承Thread类与实现Runnable接口的区别

  • 我们都知道java支持单继承,多实现。实现Runnable接口还可以继承其他类,而使用继承Thread就不能继承其他类了。所以当你想创建一个线程又希望继承其他类的时候就该选择实现Runnable接口的方式。

实现Callable接口与Runnable接口的区别

  • Callable执行的方法是call() ,而Runnable执行的方法是run()。
  • call() 方法有返回值还能抛出异常, run() 方法则没有没有返回值,也不能抛出异常。

你可能感兴趣的:(Java-创建线程的三种方式)