Java中创建线程的三种方式

Java中创建线程的三种方式

1.继承Thread类创建线程

2.实现Runnable接口创建线程

3.使用Callable和Future创建线程

1.Thread创建线程

public class Match1 {
    public static void main(String[] args) {
        Runner liuxiang = new Runner();
        liuxiang.setName("刘翔");

        Runner zhangsan = new Runner();
        //线程命名
        zhangsan.setName("张三");

        liuxiang.start();
        zhangsan.start();
    }
}
class  Runner extends Thread{
    @Override
    public void run() {
        Integer speed = new Random().nextInt(100);
        for (int i = 1; i <= 100; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(this.getName()+"跑了"+i*speed+"米");
        }
    }
}

 

结果:

 

 

 2.实现Runnable接口

public class Match2 {
    public static void main(String[] args) {
        Runner2 liuxiang = new Runner2();
//        Thread thread1 = new Thread(liuxiang,"刘翔");
        Thread thread1 = new Thread(liuxiang);
        thread1.setName("刘翔");

        //后台继承Thread直接用不同,需要创建Thread对象来实现
        Thread thread2 = new Thread(new Runner2(),"张三");
        thread1.start();
        thread2.start();
    }
}
class  Runner2 implements Runnable {
    @Override
    public void run() {
        Integer speed = new Random().nextInt(100);
        for (int i = 1; i <= 100; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //Thread.currentThread()用于获取当前线程
            //在Runnable中无法使用this获取当前线程
            System.out.println(Thread.currentThread().getName()+"跑了"+i*speed+"米");
        }
    }
}

 结果:

 

 3.利用线程池

public class Match3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建线程池。线程池中有3个线程,可以执行3个线程,多余的线程会等待。
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        Runner3 liuxiang = new Runner3();
        liuxiang.setName("刘翔");
        Runner3 zhangsan = new Runner3();
        zhangsan.setName("张三");
        Runner3 lisi = new Runner3();
        lisi.setName("李四");
        Runner3 wangwu = new Runner3();
        wangwu.setName("王五");
        //Future用于接收线程内部call方法的返回值
        Future<Integer> result1 = executorService.submit(liuxiang);
        Future<Integer> result2 = executorService.submit(zhangsan);
        Future<Integer> result3 = executorService.submit(lisi);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        executorService.shutdown();//关闭线程池释放资源
        System.out.println("刘翔跑了"+result1.get()+"米");
        System.out.println("张三跑了"+result2.get()+"米");
        System.out.println("李四跑了"+result3.get()+"米");
    }
}

class Runner3 implements Callable<Integer> {
    private String name;
    public void setName(String name){
        this.name = name;
    }
    //实现Callable接口的call方法允许有返回值和抛出异常
    @Override
    public Integer call() throws Exception {
        Integer speed = new Random().nextInt(100);
        Integer distance = 0;
        for (int i = 1; i <= 100; i++) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            distance = speed * i;
            System.out.println(this.name+"跑了"+distance+"米("+speed+"米/秒)");
        }
        return distance;
    }
}

结果:

 

 创建线程的三种方式的对比

 

posted @ 2022-10-10 08:39  求道之愚者  阅读(456)  评论(0)    收藏  举报