Java多线程——多线程创建的方法

继承线程类创建多线程

public class TestThread extends Thread{

    //TestThread线程跑步
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("我跑了"+i+"米");
        }
    }

    public static void main(String[] args) {
        TestThread testThread = new TestThread();
        testThread.start();//开启线程

        //主线程听音乐
        for (int i = 0; i < 100; i++) {
            System.out.println("我在听音乐"+i);
        }
    }
}

实现Runnable接口创建多线程

//实现Runnable接口
public class TestThread implements Runnable{

    //TestThread线程跑步
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("我跑了"+i+"米");
        }
    }

    public static void main(String[] args) {
        TestThread testThread = new TestThread();
        new Thread(testThread).start();//启动线程
        //主线程听音乐
        for (int i = 0; i < 100; i++) {
            System.out.println("我在听音乐"+i);
        }
    }
}

实现Callable接口创建多线程

//实现Callable接口
public class TestThread implements Callable<Integer> {

    //TestThread线程跑步
    @Override
    public Integer call() {
        int i;
        for (i = 0; i < 100; i++) {
            System.out.println("我跑了"+i+"米");
        }
        return i;
    }

    public static void main(String[] args) {
        FutureTask<Integer> futureTask = new FutureTask<Integer>(new TestThread());
        new Thread(futureTask).start();//启动线程
        
        //接收线程运算后的结果
        try{
            Integer sum = futureTask.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        //主线程听音乐
        for (int i = 0; i < 100; i++) {
            System.out.println("我在听音乐"+i);
        }
    }
}

线程池实现多线程

//线程池实现
public class TestThread implements Runnable  {

    //TestThread线程跑步
    @Override
    public void run() {
        int i;
        for (i = 0; i < 100; i++) {
            System.out.println("我跑了"+i+"米");
        }
    }

    public static void main(String[] args) {
        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        TestThread testThread = new TestThread();
        //为线程池分配任务
        executorService.submit(testThread);
        //关闭线程池
        executorService.shutdown();
        //主线程听音乐
        for (int i = 0; i < 100; i++) {
            System.out.println("我在听音乐"+i);
        }
    }
}

总结(优劣对比)

  • 通过代码可以看出,第一种方法是最简洁方便的,直接就可以start,不需要任何转换
  • 但是第一种有一个很不好的地方就是继承了Thread类后由于java的单继承机制,就不可以继承其他的类了,而如果实现的是接口,就可以实现多个接口,使开发更灵活。
  • 第三种方法有两个优点:有返回值、可以抛出异常

实际开发中可能有更复杂的代码实现,需要继承其他的类,所以平时更推荐通过实现接口来实现多线程,也就是通过第二或第三种方式来实现,这样能保持代码灵活和解耦。
而选择第二还是第三种方式,则要根据run()方法是不是需要返回值或者捕获异常来决定,如果不需要,可以选择用第二种方式实现,代码更简洁。

posted @ 2022-03-31 14:57  又一岁荣枯  阅读(18)  评论(0编辑  收藏  举报