线程的创建方法和介绍

QT线程创建的两种方法 一.方法一 1.主线程(TaskProcessing.h和TaskProcessing.cpp) 2.子线程(ThreadWork.h和ThreadWork.cpp) 二.方法二 QT提供的第二种线程的创建方式弥补了第一种方式的缺点,用起来更加灵活,步骤如下: 1.创建一个新的类,让这个类从QObject派生 class ThreadWork:public QObject { … } 2.在这个类中添加一个公共的成员函数,函数体就是要子线程中执行的业务逻辑 class ThreadWork:publ 阅读详情

线程的创建方法和介绍

  一个进程对应多个线程
   可以充分发挥COP性能的一个东西,一个进程至少有一个线程
   cpu 如何处理线程:单位时间片上高速的切换线程,并且一个单核的cpu值能处    理一个线程
   cpu的处理最小单位是线程,线程获取cpu的机会是一样的
   线程将一个独立的任务.包装成一块代码块,交给cpu 处理
    cpu决定分配资源给谁:线程的执行由cpu决定
    代码执行流程由cpu决定
    如果执行多个线程:
    看到的效果: 两个任务不规则的交替执行:

Threa类: Java中的线程类

run: 线程的线程体

需要包装任务,需要独立执行的代码块,

start: 启动线程的方法,告诉cpu,我准备好了.

第一种方法创建线程,继承Threa类,:

覆写run方法

要写几个类,根据功能的数量决定,定义线程类的数量

根据确定的功能,覆写run方法

创建线程对象,

调用start方法,启动线程

实例: 利用线程多个下载

cpu处理线程不一定马上分配资源,因为计算机有很多线程

期望看到的效果:交替不规则

public class Thread_2 extends Thread { //继承Thread类
   private String name;   //设一个字段 
    Thread_2(String name) {
        this.name = name;
    }
    @Override
    public void run() {  
        for (int i = 0; i < 100; i++) {
            System.out.println(name+"下载了" + i + "%");
        }
    }
}

测试:

public class Thread_1 {
    public static void main(String[] args) {
        System.out.println("打印一个单线程");
        Thread_2 thread_2=new Thread_2("金牌梅");   //启动线程的对象
        //thread_2.run();//只是调用方法而已,并不是线程
        thread_2.start();  //start 启动线程
        Thread_2 thread_21=new Thread_2("斗罗");
        thread_21.start();  //和第一个start交替

    }
}
斗罗下载了70%
金牌梅下载了81%
斗罗下载了71%
金牌梅下载了82%
斗罗下载了72%
金牌梅下载了83%
斗罗下载了73%
金牌梅下载了84%
斗罗下载了74%
金牌梅下载了85%
斗罗下载了75%
斗罗下载了76%
金牌梅下载了86%
斗罗下载了77%
金牌梅下载了87%
斗罗下载了78%
金牌梅下载了88%
斗罗下载了79%
金牌梅下载了89%
斗罗下载了80%
斗罗下载了81%
    交替不规则的效果

线程run方法作为线程的线程,必须覆写run方法:

上面方法还是不够完善,存在线程安全问题:

创建一个锁对象,可以被多个线程共享,相当于一个共享锁’

Object obj=new Object();

调用synchronized (obj) { 需要锁的数据 }

代码演示:

class Tic extends Thread   {
    private  static String name;
    static int tickets = 100;      //继承的字段,要共享.加static

  staic  Object obj = new Object();  //创建一个锁对象,可以被多个线程共享的的数据 ,必须共享锁

    public Tic(String name) {  //父类Thread也可以继承父类的(                                      (String name)
        this.name = name;
        //super(name);直接调用父类的
    }
    
    @Override  //必须覆写方法
    public void run() {
        while (true) {
            synchronized (obj) {
                if (tickets > 0) {
                    System.out.println(name + "卖出的座位是" + tickets--);

                } else {

                    break;
                }
            }
            try {
                Thread.sleep(100);                   //休眠时间  .自定义异常
            } catch (InterruptedException e) {
                e.printStackTrace();                     
            }

        }
        System.out.println(name + "票已经买完");            //
    }
}

调用start和调用run的区别;

调用start方法,就是启动一个线程,

线程一旦启动,就谁也管不了,只能由cpu分配. (每个线程都是独立的)

run方法里面只是一个普通方法;

run只是一个普通方法,也可以对象直接调用,

如果想要字段是共享的,字段必须static修饰,如果调用的是Runnable接口,

不需要用static 都是共享的,调用的就是一个线程对象,在Thread对象中去调用.

线程的第二种创建方式: 实现Runnable接口

run方法其实算是Runnable接口的,Thread也只不过调用,但是Runnable没有启动方法static的,所有使用接口覆写run方法还得启动,就只有new Thread对象作为一个可以放Runnable的壳.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLiQTleL-1616227251595)(C:\Users\ljl\AppData\Local\Temp\1555909743633.png)]

首先看看下面的图解,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sqmxjTwf-1616227251596)(C:\Users\ljl\AppData\Local\Temp\1555904503817.png)]

代码详解:

class Runnable_11 implements Runnable {

    //String name;
    int num = 100;

  /* Runnable_11(String name){
       this.name=name;
   }*/

    @Override
    public void run() {
        while (num > 0) {
            if (num > 0) {
                System.out.println( "打印" + num);
                num--;
            }else {
                break;
            }
        }
    }
}

测试:

public class Runnable_1 {
    public static void main(String[] args) {
        Runnable_11 runnable_11 = new Runnable_11();
        Thread thread1 = new Thread(runnable_11,"第一");
        Thread thread2 = new Thread(runnable_11,"第二");
        Thread thread3 = new Thread(runnable_11,"第三");
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

代码执行流程是独立的,但是对象是同一个,字段也是同一个,
每个线程访问的都是同个对象,同个字段,
实现的时候,不需要加static,所有字段都共享
继承:每个对象都是独立一份,
继承只能但几次,
接口:只需要创建一个对象,不需要static 就可以让字段共享
可以实现多个接口,
还可以继承想要的类

实现Runnable接口的线程同步

接口的线程同步的对象可以是this ,"" Object,

this表示当前对象,线程实现接口只创建一个对象,所有每次线程的对象都是一个

注

  1. 同步监听对象保证自身就是同步监听对象 //同步监听的基础条件
  2. 必须保证多个线程访问的对象都是同一个同步监听对象//同步监听的基础条件
  3. 同不监听对象可以是任意对象,再上面都满足的情况下
    4)this也可以是同步监听对象 (实现接口接口)
    5)当前类的字节码对象.class

代码实现:

class Runnable_11 implements Runnable {
    //String name;
    int num = 100;


    @Override
    public void run() {
        while (num > 0) {
            synchronized ("") {
                if (num > 0) {
                    //当前线程对象的引用 ....  获取名字
                    System.out.println(Thread.currentThread().getName() + "打印" + num);
                    num--;
                }
            }
        }
    }
}

​ 实现接口 写线程名字必须注意的的方法Thread.currentThread().getName():

获取当前线程对象的名字:

//当前线程对象的引用 ....  获取名字
System.out.println(Thread.currentThread().getName() + "打印" + num);

​

接口和基础的同步对象的区别

​ 代码执行流程是独立的,但是对象是同一个,字段也是同一个,

​ 每个线程访问的都是同个对象,同个字段,
实现的时候,不需要加static,所有字段都共享
继承:每个对象都是独立一份,
继承只能但几次,
接口:只需要创建一个对象,不需要static 就可以让字段共享
可以实现多个接口,
还可以继承想要的类

接口:同步代码块,可以是this 只有一个对象 ,可以" "字符串,

线程休眠

Thread.sleep(): 再指定线程内让线程处于休眠状态,

线程类Thread当中有一个static void sleep(long millis)方法,在指定的毫秒数内让当前正在执行的线程休眠

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ww1TQ7o8-1616227251598)(file:///C:\Users\ljl\AppData\Local\Temp\ksohtml6176\wps1.jpg)]

  1. 可以做倒计时:代码清单:

    Frame f = new Frame();
    		Label label = new Label("10");
    		label.setBackground(Color.RED);
    
    	// 字体对象
    		Font font = new Font("宋体",Font.BOLD,666);
    		label.setFont(font);
    		label.setAlignment(Label.CENTER);
    		f.add(label);
    		
    		f.setSize(780, 780);
    		f.setLocationRelativeTo(null);
    		f.setVisible(true);
    		
    		for (int i = 10; i >= 0; i--) {
    			label.setText(i+"");
    			Thread.sleep(1000)
    

    2.可以用来模拟网络延迟,

操作系统|知识梳理|复习(下) 操作系统复习 阅读详情

相关推荐

JS逆向-快手__NS_hxfalcon参数分析

现在快手H5接口都需要__NS_hxfalcon这个参数,这篇文章就是逆向这个参数

ckcookies的博客 4073

线程是如何实现的?

不论是进程还是线程,都必须直接或间接地取得内核的支持。由于内核支持线程可以直接利用系统调用为它服务,故线程的控制相当简单;而用户级线程必须借助于某种形式的中间系统的帮助方能取得内核的服务,故在对线程的控制上要稍复杂些。 1.内核支持线程的实现 在仅设置了内核支持线程的 OS 中,一种可能的线程控制方法是,系统在创建一个新进程时,便为它分配一个任务数据区 PTDA ( Per Task Data Area ),其中包括若干个线程控制块 TCB 空间,如图所示。 在每一个 TCB 中可保存线程标识符、优先级、

Alkali!的博客 1074

麒麟V10 SP3国产化环境部署MySQL 8.0全流程实战

本文详细介绍了在国产化操作系统麒麟V10 SP3上部署MySQL 8.0的全流程实战指南。从环境准备、冲突排查到安装包处理、服务配置与安全加固,提供了详细的命令和技巧,帮助用户顺利完成MySQL 8.0的部署与优化,适用于国产化环境下的数据库应用。

weixin_29231027的博客 265

线程的创建方式

1、继承 Tread类, 重写 run方法2、实现 Runnable接口,实现 run方法3、实现 Callable接口,实现 call方法,该方式可以获取线程的执行结果。

weixin_46760166的博客 9451

3、流程引擎下载安装与部署

camunda有多种使用方式,此处先使用独立平台的方式部署引擎,这种用法适合分布式,微服务化,多语言异构系统的使用方式。

leyoliu的博客 5520

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

创建线程三种方法

null :池中一直保持的线程的数量,即使线程空闲也不会释放。除非设置了 allowCoreThreadTimeOut *池中允许的最大的线程数当线程数大于核心线程数的时候,线程在最大多长时间没有接到新任务就会终止释放, 最终线程池维持在 corePoolSize 大小时间单位阻塞队列,用来存储等待执行的任务,如果当前对线程的需求超过了 corePoolSize大小,就会放在这里等待空闲线程执行。创建线程的工厂,比如指定线程名等。

一个菜鸡的博客 5958

基于STM32设计的智能防盗单车锁_349

本设计基于STM32F103RCT6单片机,研制了一种适用于户外环境的智能防盗单车锁系统。系统集成了GPS定位模块、ADXL345加速度传感器、4G通信模块(Air780E)、OLED显示屏、继电器模拟锁控模块等硬件,通过姿态感知实现车辆异常移动检测,在锁车状态下自动触发蜂鸣器报警并通过短信与APP通知用户。

865

创建线程的三种方式、线程运行原理、常见方法、线程状态

文章目录1.创建线程的三种方式1.1 继承Thread类并重写run方法1.2 使用Runnable配合Thread1.3 通过Callable和FutureTask创建线程2.Runnable和Thread的区别3.Thread类源代码剖析4.线程运行原理4.1 栈与栈帧 1.创建线程的三种方式 1. 继承Thread类并重写run方法。 2. 实现Runnable接口,然后实现其run方法。 3. 通过Callable和Future创建线程。 将我们希望线程执行的代码放到 run 方法中,然后通过 st

张大安的博客 6284

【Cmder】--- Windows11 配置CMD神器 (超详细 持续更新中)

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1万+

基于STM32、HAL库的RN8209D电能计量芯片驱动程序设计

/ 假设电压互感器变比为220V:0.5V,电流互感器变比为20A:5mA。// 电压ADC原始值。// 电流ADC原始值。// 有功功率(W)// 电能(kWh)

corlin6688的博客 469

线程的四种创建方式

一、继承Thread类 创建类继承Thread类,并重写run()方法,通过start()启动线程。以继承的方式创建的线程可以使用当前类来获取线程的名称、状态、优先级等相关信息,因为其继承了Thread类的相关方法。 public class MyThread extends Thread{ @Override public void run(){ //...... //...... //业务代码 } } public cl

weixin_48950939的博客 3899

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

线程介绍及其Java如何用Thread 类创建线程和操作线程方法

Java 线程(Thread)是 Java 虚拟机(JVM)中的一种轻量级进程。每个线程都拥有自己的程序计数器、寄存器和栈,用于执行不同的任务。线程可以提高程序的响应速度、提高系统的吞吐量和提高用户体验。Java 线程(Thread)是 Java 虚拟机(JVM)中的一种轻量级进程。每个线程都拥有自己的程序计数器、寄存器和栈,用于执行不同的任务。线程可以提高程序的响应速度、提高系统的吞吐量和提高用户体验。

m0_73940426的博客 1398

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

线程优先级演示和Thread类中的方法介绍,创建线程的方式

线程优先级演示 package com.hpeu.thread; /** * 线程优先级演示 * public final static int MIN_PRIORITY = 1; * public final static int NORM_PRIORITY = 5; * public final static int MAX_PRIORITY = 10; * getPriority(...

qq_45753477的博客 181

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Java操作系统】线程的介绍和创建方法

线程(thread) 如果把线程想象成是一个工厂,线程就是若干个流水线: 线程其实是包含在进程中的 一个进程中可能会有多个线程 每个线程都有一段自己要执行的逻辑(指令),每个线程都是一个独立的“执行流” 同一个进程中的很多线程之间,是共享了一些资源 所谓的“线程”可以理解成一种轻量级“进程”,也是一种实现并发编程的方式,创建一个线程比创建一个进程成本低,销毁一个线程,比销毁一个进程成本低。 成本低的原因是,新创建一个线程,不需要给这个线程分配很多新的资源,大部分资源都是和原来线程共享的,如果新创

博客 414

创建线程的四大方法及线程池的七大参数

为什么要使用线程池? 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后再线程创建后启动这些任务如果线程的数量超过最大数量,超过数量的线程将排队等候,等其他线程执行完毕,再从队列中取出任务来执行 特点:线程复用,控制最大并发数,管理线程 一、降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗 二、提高响应速度,当任务到达时,任务可以不需要的等到线程创建就...

yongxuezhen的博客 1万+

什么是线程?线程和进程的关系?如何创建/查看线程?

本为详细介绍了线程的概念, 进程和线程之间的关系, 以及线程的创建方法

m0_73594607的博客 4857

在子线程中创建线程的方法

与在主线程创建子线程的方法是一样的----Windows95是Microsoft公司的第一个真正的多任务操作系统。在每一时刻可以有多个进程同时工作,而每一个进程又包含有多个线程。但只有一个处理器的计算机不可能真正地“同时”执行多个线程,而是操作系统把时间分成若干个时间片,然后把一个个时间片分配给每一个线程。----一个执行了的程序就是一个进程,一个进程则至少有一个主线程。一位高级程序员,绝不会让自

技术天地 3235

VS C++ 线程篇之一创建线程

创建线程创建线程方法一、HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全属性 SIZE_T dwStackSize, // 线程堆栈大小 LPTHREAD_START_ROU...

Geek猫的专栏 2万+

线程创建、实现和方法

通过 interrupt() 设置线程为中断状态,该方法是通过抛出 InterruptedException异常使线程中断,但是该线程要处于能感知该异常的状态时才会生效。启动线程,先要创建实现 Callable 接口的类,将该对象作为创建 Thread 时的参数,调用 start() 方法启动线程。当有线程调用 join() 方法时,join() 方法通过 wait() 实现,被查对的是主线程,主线程处于等待状态。启动线程时,构建重写 Thread类 的子类,调用 start() 方法启动线程。

cfz1095858425的博客 1258

JAVA线程基础——线程的创建和常用方法

如上代码中的 MyThread 类继承了 Thread 类,并重写了run()方法。在 main 函数里面创建了一个 MyThread 的实例,然后调用该实例的start 方法启动了线程。需要注意的是,当创建完 thread 对象后该线程并没有被启动执行,直到调用了start方法后才真正启动了线程。其实调用 start 方法后线程并没有马上执行而是处于就绪状态,这个就绪状态是指该线程已经获取了除 CPU 资源外的其他资源,等待获取 CPU 资源后才会真正处于运行状态。

weixin_45826852的博客 895

Java多线程(一):线程的创建方式和常见构造方法以及常用属性

1.3 进程和线程的区别进程是包含线程的,

2401_87254593的博客 1762

[线程]线程的概念及如何用java创建线程

此时, 每个客户端连上服务器, 服务器都会创建一个进程, 客户端断开, 再把进程释放掉, 那么如果这个服务器, 频繁地有客户来来去去, 服务器也需要频繁地创建和销毁进程, 此时就会带来新问题, 创建和销毁进程的花销太大了!把任务内容和线程拆分开, 这样的任务, 就可以给其他地方执行, 当前是通过多线程的方式执行的, 未来也可以方便改成基于线程池方式执行, 也可以改成基于虚拟线程的方式执行(改动过程很简单)但是在实际开发中, 是要自定义的,可能会打印一些日志, 把出现的异常的详情都记录到日志文件中;

m0_73992740的博客 1168

MFC中创建和使用线程的方法

有关创建线程的问题有三种方法: 1.C语言函数,调用_beginthread(); 2.API函数,调用CreateThread(); 3.MFC函数,调用AfxBeginThread(); 推荐使用MFC函数AfxBeginThread(); 利用MFC里的AfxBeginThread函数能很方便地创建线程以及对线程进行等待、唤醒等操作。 1、函数原型 CWinThread* AfxBeginThr...

qq_38883139的博客 2614

线程创建方式、构造方法和线程属性

而线程的状态、是否被中断,在接下来的文章中重点介绍。因为上面的情况,Thread对象和线程的生命周期不完全一样,所以不容易直接判断,就需要借助一些方法来获取当前线程的属性-是否存活。结论:说明他们之间没有什么关系,无法真正的判断线程是否结束了,所以可以通过isAlive()方法判断当前的线程是否还存货。创造线程的基本两步:(1)使用run方法记录线程要做的任务(2)使用线程的引用 调用start开启线程。这里只简单的查看一个线程是否被中断,至于如何中断一个线程,在后面介绍线程的核心操作部分介绍。

2301_77053417的博客 1010

四种线程的创建方法

线程池通过复用线程,减少了线程的创建和销毁开销,同时提供了对线程的统一管理,包括线程的调度、任务队列的维护等。一个线程可以被看作是一个独立的执行路径,可以运行并发任务,例如处理网络请求、文件操作或复杂的计算。接口的方式将线程的任务逻辑和线程的生命周期管理分离,使得类的继承层次更加灵活,适用于需要共享资源或已经有父类的场景。线程池在程序启动时会预先创建一定数量的线程,任务提交后会从线程池中复用线程来执行任务,从而提高性能。,不仅可以启动线程,还可以对任务执行结果进行管理,例如结果的阻塞获取、超时等待等。

m0_53926113的博客 1310
上一篇: Java中的异常和处理详解及总结
下一篇: 数据结构
gudfdd
博客等级 码龄8年 1粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值