• 创建线程的三种方式


    多线程(Thread)

    线程概述:

    • 程序:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念

    • 进程:进程是程序执行一次的过程,是一个动态的概念,它负责了这个程序资源的分配;

    • 线程:一个进程包含多个线程,最少有一个,是进程中的一个执行路径,线程是CPU调度和执行的单位;

    • 多线程:就是一个进程中,多个执行路径同时执行

    创建线程的三种方式:

    继承Thread类:

    1、自定义线程类继承Thread类

    2、重写run()方法,编写执行内容;

    3、创建自定义线程类的对象,调用start()方法启动线程;

    package com.xu.threads;
    
    public class TestThread01 extends Thread { // 继承Thread类
        @Override // 重写run()方法
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("我在写代码"+i);
            }
        }
    
        public static void main(String[] args) {
    
            TestThread01 testThread01 = new TestThread01(); // 创建线程对象
            testThread01.start();  // 调用start()方法开启线程
    
            for (int i = 0; i < 20; i++) {
                System.out.println("我在听歌"+i);
            }
        }
    }
    

    实现runnable接口:

    1、自定义线程类实现Runnable接口

    2、重写run()方法,编写执行内容;

    3、创建自定义线程类的对象,把对象丢入Thread()的构造,调用start()方法启动线程;

    package com.xu.threads;
    
    public class TestThread02 implements Runnable { // 实现Runnable接口
        @Override // 重写run()方法
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("我在写代码"+i);
            }
        }
    
        public static void main(String[] args) {
    
            TestThread02 testThread02 = new TestThread02(); // 创建线程对象
             new Thread(testThread02).start(); // 把对象丢入Thread()构造,调用start()方法;
    
            for (int i = 0; i < 20; i++) {
                System.out.println("我在听歌"+i);
            }
        }
    }
    

    实现Callable接口:

    1、自定义线程类实现Callable接口,需要返回值类型

    2、重写call方法,需要抛出异常;

    3、创建自定义线程类对象;

    4、创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(3);

    5、提交执行:Future submit01 = ser.submit(testCallable01);

    6、获取结果:Boolean aBoolean01 = submit01.get();

    7、关闭服务:ser.shutdownNow();

    package com.xu.threads;
    
    import java.util.concurrent.*;
    
    public class TestCallable implements Callable<Boolean> {
        @Override
        public Boolean call() throws Exception {
            for (int i = 0; i < 50; i++) {
                System.out.println(Thread.currentThread().getName()+"在写作业!");
            }
            return true;
        }
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            // 创建自定义线程类对象
            TestCallable testCallable01 = new TestCallable();
            TestCallable testCallable02 = new TestCallable();
            TestCallable testCallable03 = new TestCallable();
    
            // 创建执行服务
            ExecutorService ser = Executors.newFixedThreadPool(3);
    		
            // 提交执行
            Future<Boolean> submit01 = ser.submit(testCallable01);
            Future<Boolean> submit02 = ser.submit(testCallable02);
            Future<Boolean> submit03 = ser.submit(testCallable03);
    		
            // 获取结果
            Boolean aBoolean01 = submit01.get();
            Boolean aBoolean02 = submit02.get();
            Boolean aBoolean03 = submit03.get();
    		
            //关闭服务
            ser.shutdownNow();
        }
    }
    
    

    相比继承Thread类,实现Runnable接口:避免了单继承的局限性,方便了同一个对象被多个线程使用,使得更加灵活方便!

  • 相关阅读:
    Leetcode(337)-打家劫舍III
    Leetcode(213)-打家劫舍II
    Leetcode(198)-打家劫舍
    Leetcode(32)-最长有效括号
    计数排序
    智能指针
    C++中的explicit
    Leetcode(878)-第 N 个神奇数字
    Leetcode(877)-石子游戏
    C++的memset
  • 原文地址:https://www.cnblogs.com/whitespaces/p/12529344.html
Copyright © 2020-2023  润新知