首页 > 其他分享 >线程

线程

时间:2023-11-23 16:01:34浏览次数:31  
标签:run Thread 创建 t1 线程 public

目录

Thread 线程

视频地址:https://www.bilibili.com/video/BV1LG4y1T7n2/?p=5&vd_source=e33a356475cf6a18a9f6345f4e44a209

一、线程创建的三种方式

方式一:继承Thread类的方式进行实现

  1. 自己定义一个类继承Thread,其实Thread也是实现Runnable接口
  2. 重写run方法
  3. 创建子类的对象,并启动线程
public class MyThread extends Thread {

    /**
     * * 线程实现的方式一:
     * * 1. 自己定义一个类继承Thread
     * * 2. 重写run方法
     * * 3. 创建子类的对象,并启动线程
     */

    private int x = 0;

    @Override
    public void run() {
        // 书写执行代码
        for (int i = 0; i < 10; i++) {
            System.out.println(this.getName() + " x : " + (this.x++));
        }

    }

    public static void main(String[] args) {

        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        // 线程名字可以通过 t.setName() 来设置
        t1.setName("线程一");
        t2.setName("线程二");
        t1.start();
        t2.start();
        System.out.println("main方法执行结束");
    }

}

方式二:实现Runnable接口的方式进行实现

  1. 自己定义一个类实现Runnable接口
  2. 重写里面的run方法
  3. 创建自己类的对象
  4. 创建一个Thread类的对象,并开启线程

@NoArgsConstructor
public class MyRunnable implements Runnable {

    @Override
    public void run() {
        // 获取当前线程的名称
        String strName = Thread.currentThread().getName();
        // n值代表循环多少次
        int n = 11;
        for (int i = 0; i < n; i++) {
            System.out.println("当前线程的名字是:" + strName + ",第" + i + "次执行!");
        }

    }

    public static void main(String[] args) {

        // 创建myRunnable任务
        MyRunnable myRunnable = new MyRunnable();
        // 创建线程对象,将任务传递给线程
        Thread t1 = new Thread(myRunnable);
        Thread t2 = new Thread(myRunnable);
        t1.setName("线程一");
        t2.setName("线程二");
        // 开启线程
        t1.start();
        t2.start();

    }

}

方式三:利用Callable接口和Future接口方式实现

  1. 创建一个类MyCallable实现Callable接口
  2. 重写call(是有返回值的,表示多线程运行的结果)
  3. 创建MyCallable的对象(表示多线程要执行的任务)
  4. 创建FutureTask对象(作用管理多线程运行的结果)
  5. 创建Thread类的对象,并启动(表示线程)
public class MyCallable implements Callable<Integer> {

    @Override
    public Integer call() {
        // 求 1-100的和
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        return sum;

    }


    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建了一个MyCallable的对象,表示多线程要执行的任务
        MyCallable callable = new MyCallable();
        // 创建FutureTask对象(作用管理多线程运行的结果)
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        //  创建线程的对象
        Thread t1 = new Thread(futureTask);
        // 启动线程
        t1.start();
        // 获取多线程运行的结果
        Integer result = futureTask.get();
        System.out.println(result);


    }


}

thread

thread中常见的成员方法:

thread-methods

  • String getName() 返回线程的名称

  • void setName(String name) 设置线程的名字(构造方法也可以设置名称)

    细节:
    1、如果我们没有给线程设置名字,线程也是默认有名字的 格式:Thread-X(X是序号,从0开始)
    2、如果我们要给线程设置名称,可以用set 方法设置,也可以用构造方法设置

  • static Thread currentThread() 获取当前线程的对象

    细节:
    当JVM虚拟机启动之后,会自动的启动多线程,其中一条线程叫做main线程,他的作用就是调用main方法,并执行里面的代码,在以前我们写的所有代码,其实都在main线程中运行

  • static void sleep(long time) 让线程休眠指定的时间,单位为毫秒

    细节:

    1、那条线程执行到这个方法,那么哪条线程就会在这里停留对应的时间

    2、方法的参数:就表示睡眠的时间,单位毫秒,1秒=1000毫秒

    3、当时间到了之后,线程会自动的醒来,继续执行下面的其他代码

二、Thread状态

  • New:新创建的线程,尚未执行;
  • Runnable:运行中的线程,正在执行run()方法的Java代码;
  • Blocked:运行中的线程,因为某些操作被阻塞而挂起;
  • Waiting:运行中的线程,因为某些操作在等待中;
  • Timed Waiting:运行中的线程,因为执行sleep()方法正在计时等待;
  • Terminated:线程已终止,因为run()方法执行完毕。

图示如下:

         ┌─────────────┐
         │     New     │
         └─────────────┘
                │
                ▼
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
 ┌─────────────┐ ┌─────────────┐
││  Runnable   │ │   Blocked   ││
 └─────────────┘ └─────────────┘
│┌─────────────┐ ┌─────────────┐│
 │   Waiting   │ │Timed Waiting│
│└─────────────┘ └─────────────┘│
 ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
                │
                ▼
         ┌─────────────┐
         │ Terminated  │
         └─────────────┘

线程终止的原因是:

  • 线程正常终止:run()方法执行到return语句返回;
  • 线程意外终止:run()方法因为未捕获的异常导致线程终止;
  • 对某个线程的Thread实例调用stop()方法强制终止(强烈不推荐使用)。

join():一个线程等待另一个线程,直到等待结束,可以指定等待时间,超过等待时间线程仍然没有结束就不再等待;

对已经运行结束的线程调用join()方法会立刻返回。

interrupt() 中断线程,对线程的调用看她是否中断,isInterrupted()标示获取自身是否中断,如果目标线程处于等待状态,该线程会抛出异常InterruptedException,一般线程处于中断状态,应该立刻结束自身线程,线程间共享变量需要使用volatile关键字标记,确保每个线程都能读取到更新后的变量值

三、异步ComletableFuture入门

  1. 分别是什么?然后如何使用?

标签:run,Thread,创建,t1,线程,public
From: https://www.cnblogs.com/alex-oos/p/17851762.html

相关文章

  • C++11线程传递参数汇总
    一、概述总结C++11线程传递参数:1.传递基本数据类型(int、double)2.传递字符串3.传递结构体4.传递类对象二、代码示例//导入线程头文件#include<thread>//导入std命名空间usingnamespacestd;//传递int类型的参数voidthreadFu......
  • Redis单线程速度快原理
    Redis单线程速度快原理基于内存存储实现我们都知道内存读写是比在磁盘快很多的,Redis基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗。高效的数据结构数据结构说明:Redis内部采用了一些精细化的数据结构和算法,例如哈希表、跳跃表、压缩列表等,这......
  • iOS信号量造成线程优先级反转
    在并发队列使用信号量会可能会造成线程优先级反转一、在iOS16&XCode14上遇到-使用信号量造成线程优先级反转问题提醒经过查询资料,发现是在XCode14上增加了工具,比如:ThreadPerformanceChecker(XCode14上默认开启的),这个工具会让APP在运行的时候,发现有例如线程优先级反转......
  • 9.9 Windows驱动开发:内核远程线程实现DLL注入
    在笔者上一篇文章《内核RIP劫持实现DLL注入》介绍了通过劫持RIP指针控制程序执行流实现插入DLL的目的,本章将继续探索全新的注入方式,通过NtCreateThreadEx这个内核函数实现注入DLL的目的,需要注意的是该函数在微软系统中未被导出使用时需要首先得到该函数的入口地址,NtCreateThreadEx......
  • 线程池-基础篇
    常用线程池Executors提供四种线程池:1.newCachedThreadPool:缓存线程池,如果线程池长度超过处理需要,可回收空闲线程,若无可回收,则新建线程。2.newFixedThreadPool:定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3.newScheduledThreadPool:计划线程池,支持定时及周期......
  • 深入Android多线程编程与性能优化
    引言在上一篇的入门篇中,我们对Android线程的基础概念和多线程编程模型有了初步了解。本篇将深入探讨多线程编程技术和性能优化策略,以提升应用的效率和响应性。高级多线程编程技术使用线程池管理线程线程池是一组预先创建的线程,用于执行任务。通过使用线程池,可以避免不断创建和销毁......
  • sqlalchemy快速使用,sqlalchemy原生操作,sqlalchemy操作表,一对多关系,多对多关系,scoped线
    1sqlalchemy快速使用......
  • piscina nodejs woker 线程池实现
    nodejs线程池工具还是很多的,piscina是一个比较活跃的项目包含的特性快速包含了固定以及可变任务场景支持灵活的线程池大小异步追踪支持取消支持支持comonj,esm,以及ts自定义任务队列linux系统上可选的cpu调度支持参考使用app.jsconstpath=require('......
  • 关于阻塞多线程
    关于阻塞多线程同步方式理解:一个循环循环100次。多线程方式理解:开10个循环同时执行循环,每个循环循环10次。......
  • python多线程中一种错误的写法
    直接先上错误代码:importmultiprocessingdeffirst_way():init=3defprocess_function(item):result=item*initreturnresultdata=[1,2,3,4,5,6,7,8,9,10]pool=multiprocessing.Pool(processes=4)#创建一个......