首页 > 其他分享 >多线程

多线程

时间:2023-06-15 16:26:10浏览次数:40  
标签:Thread 对象 创建 实现 线程 子类 多线程

概念

程序:一段静态的代码
进程:运行中的程序 进程作为资源分配的单位
线程: 进程进一步细化为线程,是一个程序内部的一条执行路径

实现方式

继承thread

  1. 创建一个继承Thread的子类
  2. 子类中重写父类的run()方法
  3. 创建子类的对象
  4. 通过 子类对象.start() 启动线程

实现runable接口

  1. 创建一个实现了runnable接口的类
  2. 实现类中实现run()方法
  3. 创建实现类对象
  4. 创建Thread类对象,并将实现类对象作形参传入构造器 new Thread(实现类对象);
  5. 通过Thread类对象 调用 start()启动线程

实现Callable接口

  1. 创建一个Callable的实现类
  2. 实现类中重写call()方法
  3. 创建该实现类的对象
  4. 将实现类对象作FutureTask 类构造器的传数,创建FutureTask类对象
  5. 将FutureTask对象作参数传递到Thread类的构造器中,创建Thread类对象,并调用start()启动线程
  6. 调用FutureTask类对象的get()方法获取返回值

线程池

  1. 创建线程池
    ExecutorService service = Executors.newFixedThreadPool(10);
  2. 执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象
    service.execute(new NumberThread());//适合适用于Runnable
    service.execute(new NumberThread1());//适合适用于Runnable
  3. 关闭连接池
    service.shutdown();
  4. 设置线程池属性
    先转
    ThreadPoolExecutor service1 = (ThreadPoolExecutor) service;
    service1.setCorePoolSize(15); //设置线程数
    service1.setKeepAliveTime(); //线程没有任务时最多保持多长时间会终止
    service1.maximumPoolSize() //最大线程数

优先选择

实现runnable接口的方式
实现方式没有类的单继承性的局限性
在多线程的情况时可以将当前对象当作锁

常用方法

start() 启动线程,并执行对象的run()方法
run() 线程在被调度时执行的操作
getName() 获取线程的名称
setName() 设置线程的名称
currentThread() 返回执行当前代码的线程 类拟this
yield() 释放当前cpu的执行权(其实没什么软用)
join() 在线程a中调用线程b的join方法,线程a会被阻塞,直到线程b彻底结束才会结束阻塞
sleep() 线程阻塞
isAlive() 判断当前线程是否还存活

线程的优先级:

  • 获取优先级
    getPriority()
  • 设置优先级
    setPriority()
  • 常量
    Thread.MAX_PRIORITY:10
    Thread.MIN_PRIORITY:1
    Thread.NORM_PRIORITY:5 -->默认优先级

线程的生命周期

新建:线程子类被构造
就绪: 调用start()之后
运行: run()方法中代码被 执行
阻塞: sleep()线程阻塞
死亡: 线程结束了它的全部工作

synchronized

实现方式

同步代码块 (指定锁)
同步方法 (非静态方法默认使用this 静态方法使用当前类)

Lock

java.util.concurrent.locks.ReentrantLock 在这个包中
new ReentrantLock(); 这个对象
.lock() 加锁
unlock() 释放锁

线程通信

wait(): 当前线程进入阻塞状态,并释放锁
notify(): 唤一个被 wait阻塞的线程。如果有多个则唤醒优先级最高的
notifyAll(): 唤醒所有被wait 阴塞的线程。

作者:杨洋

标签:Thread,对象,创建,实现,线程,子类,多线程
From: https://www.cnblogs.com/DTCLOUD/p/17483222.html

相关文章

  • Java 多线程同步问题的探究(二、给我一把锁,我能创造一个规矩)
    在上一篇中,我们讲到了多线程是如何处理共享资源的,以及保证他们对资源进行互斥访问所依赖的重要机制:对象锁。本篇中,我们来看一看传统的同步实现方式以及这背后的原理。很多人都知道,在Java多线程编程中,有一个重要的关键字,synchronized。但是很多人看到这个东西会感到困惑:“都说同......
  • Python教程-多线程与多进程
    什么是线程,什么是进程?进程是程序(软件,应用)的一个执行实例,每个运行中的程序,可以同时创建多个进程,但至少要有一个。每个进程都提供执行程序所需的所有资源,都有一个虚拟的地址空间、可执行的代码、操作系统的接口、安全的上下文(记录启动该进程的用户和权限等等)、唯一的进程ID、环境变......
  • Linux C 编程——多线程
    线程是计算机中独立运行的最小单位,运行时占用很少的系统资源。与多进程相比,多进程具有多进程不具备的一些优点,其最重要的是:对于多线程来说,其能够比多进程更加节省资源。1、线程创建在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原......
  • v831-openwrt-c-多线程、队列篇
    前言这几天都在搞多线程和队列,但是最后发现由于v831的单核,用了多线程和队列还不如不用,并且吐槽一下c的线程和队列库,特别队列库很难用。线程库#include<pthread.h>      //系统的多线程文件使用条例:使用的很简单,网上的说明很清楚,不需要详细说明指向感悟很鸡肋......
  • Java多线程与静态方法
    Java多线程与静态方法在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?是否会发生线程安全问题? publicclassTest{publicstaticvoidoperation(){//...dosomething}} 事实证明只要在静态函数中没有处理多......
  • C#如何进行多线程编程
    C#如何进行多线程编程由于多线程编程非常复杂,这个小例子只能算是一个入门线的知识点吧首先建一个应用程序项目,命名为ThreadExample,在窗体上放一个文本框(textBox1) ,一个标签(lblResult),再放两个按钮,分别命名为btnStart、btnStop。窗体代码:namespaceThreadExample{......
  • 小灰灰深度学习day9——多线程读取小批量数据(这里运行的时候报错了,目前还不会解决,
    在这里先把代码放上来importtorchimporttimeimportnumpyasnpimporttorchvisionfromtorch.utilsimportdatafromtorchvisionimporttransformsfromd2limporttorchasd2ld2l.use_svg_display()#利用svg显示图片importosos.environ["KMP_DUPLICATE_LIB_OK......
  • 2020-10-26 多线程学习1
    join关键字测试:publicclassTestJoin{publicstaticvoidmain(String[]args)throwsInterruptedException{//TODOAuto-generatedmethodstubfor(inti=0;i<3;i++){ThreadTestt1=newThreadTest("A");......
  • 多线程和多进程
    在真实业务中不单单会涉及CPU计算,还有网络IO和磁盘IO处理,这些处理是非常耗时的。如果一个线程整个流程是上图的流程,真正涉及到CPU的只有2个节点,其他的节点都是IO处理,那么线程在做IO处理的时候,CPU就空闲出来了,CPU的利用率就不高。多线程:提升CPU利用率。 最佳线程数目=((线程等......
  • [转][Java]多线程写法
     多线程 闭包写法: 简化写法: ......