创建线程的三种方式

JAVA中创建线程的三种方式
1.继承Thread类创建线程
2.实现Runnable接口创建线程
3.线程池(使用callable和Future)创建线程

1.Thread

package com.company.thread;

import java.util.Random;

/**
 * 使用继承Thread的方式实现多线程
 * 创建一个比赛的类
 */
public class Match {

    public static void main(String[] args) {
        //创建新的线程
        Runner runner=new Runner();
        //设置线程名称
        runner.setName("刘翔");
        
        //创建新的线程
        Runner runner2=new Runner();
        //设置线程名称
        runner2.setName("罗伯特");
       
        //创建新的线程
        Runner runner3=new Runner();
        //设置线程名称
        runner3.setName("孙悟空");

        //启动线程
        runner.start();
         //启动线程
        runner2.start();
        //启动线程
        runner3.start();
    }
}
/**
 * 跑步运动
 */
class Runner extends Thread {
    @Override
    public void run() {
    //取100以内的随机数,当做速度
    int speed=new Random().nextInt(100);
    //跑100秒
    for (int i=1;i<=100;i++){
        try {
            //设置休眠一秒
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //this.getName()当前线程的名称
        System.out.println(this.getName()+"跑了"+(i*speed)+"米,当前速度为:"+speed+"米/秒");
    }
    }
}

启动了三个线程 没有配置优先级 所以是cpu随机分配 看效果图
创建线程的三种方式_第1张图片
扩展个小问题 :在以上方法 一共创建了几个线程?
答案:5个 分别是 主线程main 刘翔 罗伯特 孙悟空 和 回收线程

2.Runnable

package com.company.thread;

import java.util.Random;

/**
 * 使用继承Thread的方式实现多线程
 * 创建一个比赛的类
 */
public class Match {

    public static void main(String[] args) {
        //创建新的线程
        Runner runner=new Runner();
        //设置线程名称
        runner.setName("刘翔");

        //创建新的线程
        Runner runner2=new Runner();
        //设置线程名称
        runner2.setName("罗伯特");

        //创建新的线程
        Runner runner3=new Runner();
        //设置线程名称
        runner3.setName("孙悟空");

        //启动线程
        runner.start();
        //启动线程
        runner2.start();
        //启动线程
        runner3.start();
    }
}
/**
 * 跑步运动
 */
class Runner extends Thread {
    @Override
    public void run() {
        //取100以内的随机数,当做速度
        int speed=new Random().nextInt(100);
        //跑100秒
        for (int i=1;i<=100;i++){
            try {
                //设置休眠一秒
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //this.getName()当前线程的名称
            System.out.println(this.getName()+"跑了"+(i*speed)+"米,当前速度为:"+speed+"米/秒");
        }
    }
}

效果图
创建线程的三种方式_第2张图片
3.线程池

package com.company.thread;

import java.util.Random;
import java.util.concurrent.*;

public class Match3 {
    public static void main(String[] args) {
        //调度器  创建一个线程池 初始有3个线程
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        //创建Runner3对象
        Runner3 liuxiang=new Runner3();
        liuxiang.setName("刘翔");

        Runner3 luobote=new Runner3();
        luobote.setName("罗伯特");

        Runner3 sunwukong=new Runner3();
        sunwukong.setName("孙悟空");


        //对象放到线程池中,线程池会随机分配一个线程给这个对象
        Future<Integer> submitLiuXiang = executorService.submit(liuxiang);
        Future<Integer> submitLuoBoTe = executorService.submit(luobote);
        Future<Integer> submitSunWuKong = executorService.submit(sunwukong);

        try {
            Thread.sleep(5000);
            executorService.shutdown();
            System.out.println("刘翔累计跑了:"+submitLiuXiang.get());
            System.out.println("罗伯特累计跑了:"+submitLuoBoTe.get());
            System.out.println("孙悟空累计跑了:"+submitSunWuKong.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class Runner3 implements Callable<Integer>{
    //设置name属性
    public String name;
    public void setName(String name){
        this.name=name;
    }

    @Override
    public Integer call() throws Exception {
        //取100以内的随机数,当做速度
        int speed=new Random().nextInt(100);
        //总共跑了多少米
        int distinet =0;
        for(int i=0;i<100;i++){
            Thread.sleep(100);
            distinet=i*speed;
            System.out.println(this.name+"跑了"+distinet+"米,当前速度为:"+speed+"米/秒");
        }
        return distinet;
    }
}

效果图
创建线程的三种方式_第3张图片
三种方式对比
创建线程的三种方式_第4张图片

你可能感兴趣的:(java)