多线程(三)创建多线程




Java中创建线程的三种方式

  • –继承Thread类创建线程
  • –实现Runnable接口创建线程
  • –使用Callable 和Future创建线程
继承Thread类实现多线程
package com.ygq.thread;

import java.util.Random;

/**
 * @author :GQ.Yin
 * @date :Created in 2019/7/19 15:36
 * @description:使用继承Thread类, 重写run方法方式实现多线程
 * @version: $version$
 */
public class Match1 {

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

        Runner xiaoyin = new Runner();
        xiaoyin.setName("小尹");

        Runner op = new Runner();
        op.setName("路飞");

        liuxiang.start();//启动线程
        xiaoyin.start();
        op.start();

        //该示例代码总共有5个线程
    }

}


class Runner extends Thread{
    @Override
    public void run() {
        Integer speed = new Random().nextInt(100);
        for (int i = 0; i <= 100; i++) {

            try {
                Thread.sleep(1000); //当前线程休眠一秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //this.getName表示打印当前线程的名字
            System.out.println(this.getName() + "已前进" + (i*speed) + "米 " + (speed + "米/秒"));
        }

    }
}
实现Runnable接口
package com.ygq.thread;

import java.util.Random;

/**
 * @author :GQ.Yin
 * @date :Created in 2019/7/19 16:01
 * @description:实现Runnable接口实现多线程
 * @version: $version$
 */
public class Match2 {
    public static void main(String[] args) {
        Runner2 liuxiang = new Runner2();//创建对象
        Thread thread1 = new Thread(liuxiang);//调用Thread构造方法 创建新的线程,将runnable实现类传入
        thread1.setName("刘翔");//设置线程名称
        thread1.start();//启动线程

        Thread xiaoyin = new Thread(new Runner2());   //创建线程
        xiaoyin.setName("小尹"); //设置线程名称
        xiaoyin.start();

        Thread op = new Thread(new Runner2());   //创建线程
        op.setName("路飞"); //设置线程名称
        op.start();

    }
}

class Runner2 implements Runnable{

    public void run() {
        Integer speed = new Random().nextInt(100);
        for (int i = 0; i <= 100; i++) {

            try {
                Thread.sleep(1000); //当前线程休眠一秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //Thread.currentThread()用于获取当前执行的线程的对象
            //Thread.currentThread().getName()用于获取当前执行的线程的对象的名称
            //在Runnable中是无法使用this.获取到当前线程的名字的
            System.out.println(Thread.currentThread().getName() + "已前进" + (i*speed) + "米 " + (speed + "米/秒"));
        }
    }
}
利用线程池-实现Callable接口
  • –JDK1.5 以后为我们提供了一个并发工具包java.util.concurrent
  • –java.util.concurrent 包含许多线程安全、测试良好、高性能的并发构建块,创建concurrent的目的就是要实现Collection框架对数据结构所执行的并发操作, 通过提供一组可靠的、高性能并发构建块, 开发人员可以提高并发类的线程安全, 可伸缩性,性能, 可读性和可靠性
package com.ygq.thread;

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

/**
 * @author :GQ.Yin
 * @date :Created in 2019/7/19 16:22
 * @description:创建多线程-利用线程池-实现Callable接口
 * @version: $version$
 */
public class Match3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建一个固定大小线程池, 里面天生有3个"空"线程, Executors是调度器, 对线程池进行管理
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        Runner3 liuxiang = new Runner3();//实例化callable对象
        liuxiang.setName("刘翔");
        //将这个对象放入executorService线程池中,线程池自动分配一个线程来运行liuxiang这个对象的call()方法
        //Future用于接收线程内部call()方法的返回值
        Future<Integer> result1 =  executorService.submit(liuxiang);


        Runner3 xiaoyin  = new Runner3();
        xiaoyin.setName("小尹");
        Future<Integer> result2 =  executorService.submit(xiaoyin);

        Runner3 op  = new Runner3();
        op.setName("路飞");
        Future<Integer> result3 =  executorService.submit(op);

        //当添加第四个线程的时候, 会等待前面几个线程释放资源之后再执行, 并不会报错
        Runner3 op1 = new Runner3();
        op1.setName("路飞1");
        Future<Integer> result4 =  executorService.submit(op1);

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //关闭线程池, 并释放所有资源
        executorService.shutdown();
        //打印程序执行的返回值 result.get();
        System.out.println("刘翔累计跑了 " + result1.get() + " 米");
        System.out.println("小尹累计跑了 " + result2.get() + " 米");
        System.out.println("路飞累计跑了 " + result3.get() + " 米");
        System.out.println("路飞1累计跑了 " + result4.get() + " 米");
    }
}



//在callable的泛型中填写返回值类型
class Runner3 implements Callable<Integer>{
    //在callable中可以自定义属性
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    //在call方法中编写具体的代码逻辑, 与之前其他两类实现比较该方法有返回值, 并且允许抛出异常
    public Integer call() throws Exception {
        Integer speed = new Random().nextInt(100);
        Integer distince = 0; //总共奔跑的距离

        for (int i = 0; i <= 100; i++) {
            Thread.sleep(10);
            distince = i * speed;
            System.out.println(this.name + "已前进" + distince + "米 " + (speed + "米/秒"));
        }

        return distince;
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值