首页 > 其他分享 >多线程篇

多线程篇

时间:2023-04-12 19:34:54浏览次数:31  
标签:调用 对象 Callable 线程 多线程 方法 wait

1.Java中实现多线程的几种方法

  • 继承Thread类

  • 实现Runnable接口

  • 实现Callable接口

  • 线程池方式创建

2.使用Thread、Runnable和Callable创建线程的优缺点

  • 采用继承Thread类的方式创建线程的优缺点

    • 优点:直接使用this即可获取当前线程,编程简单

    • 缺点:已经继承了Thread类,无法再继承其他父类了

  • 采用实现Runnable、Callable接口的方式创建线程的优缺点以及区别

    • 优点:线程类只是实现了Runnable或者Callable接口,还可以继承其他类。这种方式下,多个线程可以给共享一个target对象,所以比较适合多个相同线程来处理同一份资源的情况。

    • 缺点:编程较为复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法。

    • 区别:

      • Runnable通过重写run方法实现,Callable通过call方法实现

      • Runnable可以提交给Thread来包装下直接启动一个线程来执行,Callable一般都是提交给ExcuteService来执行

      • Runnable的任务无返回值,Callable的任务执行后有返回值

      • call方法可以抛出异常,run方法不可以

      • 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。

3.如何停止一个正在运行的线程

  • 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
  • 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法
  • 使用interrupt方法中断线程

4.sleep()和wait()有什么区别

  • sleep()方法属于Thread类中的;而wait()方法属于Object类中的。
  • sleep()方法导致程序暂停执行指定的时间,让出cpu给其他线程,但是它的监控状态依然保持着,当指定时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁;而调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备,获取对象锁进入运行状态。

5.volatile 是什么?可以保证有序性吗?

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰后,那么保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 什么叫保证部分有序性,即当程序执行到volatile变量的读写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行。 使volatile一般用于状态标记量和单例模式的双检锁。

 

6.为什么wait和notify方法要在同步块中调用?

  • 只有在调用线程拥有某个对象的独占锁时,才能够调用该对象的wait(),notify()和notifyAll()方法

  • 如果不这么做会抛出IllegalMonitorStateException异常

  • 避免wait()和notify()之间产生竞态条件 wait()方法强制当前线程释放对象锁。这意味着在调用某对象的wait()方法之前,当前线程必须已经获得该对象的锁。因此线程必须在某个对象的同步方法或同步代码块中才能够调用该对象的wait()方法。 在调用对象的notify()和notifyAll()方法之前,调用线程必须已经得到该对象的锁,因此,必须在某个对象的同步方法或同步代码块中才能够调用该对象的notify()和notifyAll()方法。 调用wait()方法的原因通常是调用线程希望某个特殊的状态或变量被设置之后再继续执行。 调用notify()和notifyAll()方法的原因通常是调用线程希望告诉其他等待线程"特殊状态已被设置"。 这个状态作为线程间通信的通道,他必须是一个可变的共享状态或变量。

 

标签:调用,对象,Callable,线程,多线程,方法,wait
From: https://www.cnblogs.com/Gloaming-Q/p/17310965.html

相关文章

  • 多线程_小记
    程序进入内存中运行就变成一个进程,进程具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位。进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)线程:同一类线程共享代码和数据空间,每个......
  • pytdx多线程示例
    #encoding=utf-8importmathfrompytdx.hqimportTdxHq_APIimportpathlibimportmultiprocessingasmpfrommultiprocessingimportPoolclassmyTdx:def__init__(self):self.HqHOSTS=pathlib.Path("HqHOSTS.txt").read_text().split(......
  • 多线程事务的提交解决办法
    多线程处理的时候,如果发生了错误,不会因为加了@Transcational注解而生效,这里需要额外使用SqlSessionTemplate{//插入主表electronicTaxBillMapper.insertBatch(masterList);//更新出库单状态outOrderDetailMapper.updateByOrderCodeList(orderCodeList);//切......
  • c++ 多线程摘记
    有没有linux和windows通用的多线程库?ChatGPT:是的,C++11标准引入了一个名为std::thread的多线程库,它可以在Windows和Linux上使用。std::thread库提供了一种方便的方式来创建和管理线程,包括启动、等待、终止和同步线程。此外,它还提供了一些便利的功能,例如线程局部存储......
  • 介绍几种等待多线程任务执行完毕的方法
    一.引言:在我们日常的开发过程中,我们经常会开启多个线程或者创建一个线程池去执行多个并发任务,当所有任务执行完毕后,我们一般会做一个统一的处理。那我们如何知道多个线程的任务已经全部执行完毕了呢?今天由我来为大家介绍几种方法:二.join()方法在这里插入图片描述......
  • 多线程下载m3u8分段视频
    1.说明m3u8是一种传输数据的方式,比如说一集20分钟的完整视频被分割成一千多段一两秒的小视频,客户端播放的时候是感觉是连续,但如果你要下载这集视频,那就要把一千多个小视频全都下载然后自己拼接成一个完整视频。拼接的话很简单,像格式工厂等很多软件都可以轻松完成,但要一个一个下载......
  • java并发编程(2):Java多线程-java.util.concurrent高级工具
    高级多线程控制类Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent,提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。ThreadLocal类ThreadLocal类用来保存线程的独立变量。对一个线程类(继承自Thread)当使用ThreadLocal维护变......
  • java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
    复习资料:《同步与异步:并发/并行/进程/线程/多cpu/多核/超线程/管程 》基本线程类基本线程类基本线程类指的是Thread类,Runnable接口,Callable接口继承Thread创建线程继承java.lang.Thread类创建线程是最简单的一种方法,也最直接。publicclassMyThread1extendsThread{}种......
  • BlockingQueue读取文本内容,多线程处理数据(线程池版本)
    importjava.io.BufferedReader;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.util.concurrent.*;publicclassceshi2{publicstaticvoidmain(String[]args)throwsInterruptedException,ExecutionExcept......
  • BlockingQueue读取文本内容,多线程处理数据
    现在有一个txt文本,每个文本中每行的内容是:id,商品id。要求:启动一个线程去读取文本的内容,把每行的内容通过使用BlockingQueue发送到队列里面,然后多线程,最好是10个线程,从BlockingQueue队列里面取出来,将地址作为请求参数,请求api接口,把返回的内容解析出来,把原内容id,商品id,结果集......