• JAVA-线程


            先上图,有点长,比较碎,有xmind文件......,详细内容均在图片里介绍了,提供了PDF文件

    1.线程简介 

            进程是操作系统中正在执行的不同的应用程序,例如:我们可以同时打开Word和记事本

            线程是一个应用程序进程中不同的执行路径。进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。

            进程是线程的容器。一个进程可以有多个线程,至少有一个线程。而一个线程只能在一个进程的地址空间活动

    2.多线程的三种实现方式

    3.线程常用方法

    3.1.Thread

    1. //Thread
    2. public class MyThread extends Thread{
    3. @Override
    4. public void run(){
    5. for (int i = 0; i < 10; i++) {
    6. System.out.println(getName() + "run方法里的函数");
    7. }
    8. }
    9. }
    10. //创建开启线程
    11. public abstract class ThreadDemo {
    12. public static void main(String[] args) {
    13. // 创建 MyThread 类的实例
    14. MyThread t1 = new MyThread();
    15. MyThread t2 = new MyThread();
    16. t1.setName("线程1");
    17. t2.setName("线程2");
    18. // 启动线程
    19. t1.start();
    20. t2.start();
    21. }
    22. }

    3.2.Runnable

    1. //Runnable
    2. public class MyRunnable implements Runnable {
    3. @Override
    4. public void run() {
    5. //获取当前线程的对象
    6. Thread thread = Thread.currentThread();
    7. System.out.println(thread.getName() + "MyRunnable.run方法实列");
    8. }
    9. }
    10. //创建开启线程
    11. public class ThreadDemo {
    12. public static void main(String[] args) {
    13. /*
    14. * 多线程的第二中启动方式:
    15. * 1.自己定义一个类实现Runnable方法
    16. * 2.重写里面的run方法
    17. * 3.创建自己的类的对象
    18. * 4.创建一个Thread类的对象,并开启线程
    19. * */
    20. MyRunnable myRunnable = new MyRunnable();
    21. Thread thread1 = new Thread(myRunnable);
    22. Thread thread2 = new Thread(myRunnable);
    23. thread1.setName("线程1");
    24. thread2.setName("线程2");
    25. thread1.start();
    26. thread2.start();
    27. }
    28. }

    3.3.Callable

    1. //Callable
    2. public class MyCallable implements Callable {
    3. @Override
    4. public Integer call() throws Exception {
    5. return 100;
    6. }
    7. }
    8. //第三种方式
    9. public class ThreadDemo {
    10. public static void main(String[] args) throws ExecutionException, InterruptedException {
    11. /*
    12. *多线程的第三种是实现方式
    13. * 特点:可以获取到多线程运行的结果
    14. * 1、创建一个类MyCallable实现Callable接口
    15. * 2、重写call方法(有返回值的,表示多线程运行的结果)
    16. * 3、创建MyCallable的对象(表示多线程要执行的任务)
    17. * 4、创建FutureTalk的对象(作用是管理多线程运行的结果)
    18. * 5、创建Thread类的对象,并启动(表示线程)
    19. * */
    20. //创建MyCallable的对象(表示多线程要执行的任务)
    21. MyCallable myCallable = new MyCallable();
    22. //创建FutureTalk的对象(作用是管理多线程运行的结果
    23. FutureTask futureTask = new FutureTask<>(myCallable);
    24. //创建对象
    25. Thread thread = new Thread(futureTask);
    26. //启动线程
    27. thread.start();
    28. //获取多线程运行的结果
    29. Integer i = futureTask.get();
    30. System.out.println(i);
    31. }
    32. }

    4.锁

    锁是一种同步机制,可以用来协调多个线程的并发访问,以保证对共享资源的安全访问。可以理解为防止一件东西同时被多个人使用。用于保护线程安全的一种机制。 

    4.1.synchronized锁

    1. static int ticket = 0;
    2. @Override
    3. public void run() {
    4. while (true) {
    5. synchronized (MyThread.class) {
    6. if (method()) break;
    7. }
    8. }
    9. }
    10. private synchronized boolean method() {
    11. if (ticket < 99){
    12. try {
    13. Thread.sleep(100);
    14. } catch (InterruptedException e) {
    15. throw new RuntimeException(e);
    16. }
    17. ticket++;
    18. System.out.println(Thread.currentThread().getName() + "正在卖第 " + ticket + "票!");
    19. }else{
    20. return true;
    21. }
    22. return false;
    23. }

    4.2.lock锁

    1. public class MyThread extends Thread {
    2. static int ticket = 100;
    3. static Lock lock = new ReentrantLock();
    4. @Override
    5. public void run() {
    6. /*
    7. * Lock实现提供比使用sunchronized方法和语句更广泛的锁定操作
    8. * lock中提供了获得锁和释放锁的方法
    9. * void lock():获得锁
    10. * void unlock():释放锁
    11. *
    12. * Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
    13. * ReentrantLock的构造方法
    14. *
    15. * ReentrantLock():创建一个ReentrantLock的实例
    16. *
    17. * */
    18. while (true) {
    19. //同步代码块,lock上锁
    20. lock.lock();
    21. if (ticket == 100){
    22. break;
    23. }else {
    24. try {
    25. Thread.sleep(100);
    26. } catch (InterruptedException e) {
    27. throw new RuntimeException(e);
    28. }finally {
    29. //释放锁
    30. lock.unlock();
    31. }
    32. ticket++;
    33. System.out.println(Thread.currentThread().getName() + "在卖第" + ticket);
    34. }
    35. }
    36. }
    37. }

    4.3.死锁

    详细介绍可看开头的图片

    5.生产者和消费者问题

    5.1.线程的等待和唤醒

    1. public class Desk {
    2. /*
    3. * 控制生产者和消费者的执行
    4. * */
    5. //是否有面条 0:没有 1:有
    6. public static int foodFlag = 0;
    7. //总个数
    8. public static int count =10;
    9. //锁对象
    10. public static Object lock = new Object();
    11. }
    12. //消费者
    13. public class Cook extends Thread {
    14. /*
    15. * 消费者
    16. * */
    17. @Override
    18. public void run() {
    19. while (true) {
    20. synchronized (Desk.lock){
    21. if(Desk.count == 0){
    22. break;
    23. }else{
    24. //判断桌子上是否有食物
    25. //如果有就等待,没有就唤醒
    26. if(Desk.foodFlag == 1){
    27. try {
    28. //等待
    29. Desk.lock.wait();
    30. } catch (InterruptedException e) {
    31. throw new RuntimeException(e);
    32. }
    33. }else{
    34. System.out.println("厨师做了一碗面条");
    35. //修改桌子状态
    36. Desk.foodFlag = 1;
    37. //唤醒
    38. Desk.lock.notifyAll();
    39. }
    40. }
    41. }
    42. }
    43. }
    44. }
    45. //生产者
    46. public class Foodie extends Thread {
    47. /*
    48. 生产者
    49. * */
    50. @Override
    51. public void run() {
    52. /*
    53. * 1.循环
    54. * 2.同步代码块
    55. * 3.判断共享数据是否到了末尾(到了末尾)
    56. * 4.判断共享数据是否到了末尾(没有到达末尾,执行核心逻辑)
    57. *
    58. * */
    59. while (true) {
    60. synchronized (Desk.lock){
    61. //先判断桌子上是否有面条
    62. if(Desk.count == 0){
    63. break;
    64. }else{
    65. if(Desk.foodFlag == 0){
    66. //如果没有
    67. try {
    68. Desk.lock.wait();//让当前线程和锁进行绑定
    69. } catch (InterruptedException e) {
    70. throw new RuntimeException(e);
    71. }
    72. }else{
    73. //把吃的总数-1
    74. Desk.count--;
    75. //如果有就开吃
    76. System.out.println(Desk.count + "碗!!!");
    77. //吃完之后,唤醒厨师继续做
    78. Desk.lock.notifyAll();
    79. //修改桌子的状态
    80. Desk.foodFlag = 0;
    81. }
    82. }
    83. }
    84. }
    85. }
    86. }

    5.2.阻塞队列

    1. public class ThreadDemo {
    2. public static void main(String[] args) {
    3. /*
    4. * 阻塞队列的继承结构
    5. * 接口:Iterable
    6. * Collection
    7. * Queue
    8. * BlockingQueue
    9. * 实现类L:ArrayBlocking : 数组 ,有界
    10. * LinkedBlockingQueue:底层是链表,无界,但不是真正的无界,最大为int的最大值+
    11. *
    12. * */
    13. ArrayBlockingQueue queue = new ArrayBlockingQueue<>(1);
    14. Cook cook = new Cook(queue);
    15. Foodie foodie = new Foodie(queue);
    16. cook.start();
    17. foodie.start();
    18. }
    19. }

    6.线程池

            线程池是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。

    6.1.ExecutorService

    1. public class MyThreadPoolDemo {
    2. public static void main(String[] args) {
    3. /*
    4. public static ExecutorService newCachedThreadPool() 创建一个没有上限的线程池
    5. public static ExecutorService newFixedThreadPool(int nThread) 创建有上限的线程池
    6. */
    7. //1.获取线程池对象,池子本身是空的,提交任务的时,池子会创建新的线程对象,
    8. // 任务执行完毕,线程归回给池子,下回再次提交任务时,不需要创建新的线程,直接复用已有的线程
    9. ExecutorService pool = Executors.newCachedThreadPool();
    10. ExecutorService pool1 = Executors.newFixedThreadPool(3);
    11. //提交任务
    12. pool.submit(new MyRunnable());
    13. pool.submit(new MyRunnable());
    14. //销毁线程池
    15. pool.shutdown();
    16. }

    6.2.ThreadPoolExecutor

    1. public class ThreadPool {
    2. public static void main(String[] args) {
    3. ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
    4. 3,
    5. 6,
    6. 60,
    7. TimeUnit.SECONDS,
    8. new ArrayBlockingQueue<>(2),
    9. Executors.defaultThreadFactory(),
    10. new ThreadPoolExecutor.AbortPolicy()
    11. );
    12. threadPoolExecutor.submit(new MyRunnable());
    13. }
    14. }

  • 相关阅读:
    【开源推荐】一个通用的后台管理系统
    数据结构——AVL树
    React 任务调度
    原创先锋后台管理平台未授权访问
    698. 划分为k个相等的子集
    基础 | 并发编程 - [导论 & volatile]
    Win10+Python3.10+OpenCV4.6.0加载显示图片
    HTTPS的理解(证书、认证方式、TLS握手)
    [附源码]Python计算机毕业设计SSM交通事故记录信息管理系统(程序+LW)
    说说原型(prototype)、原型链
  • 原文地址:https://blog.csdn.net/m0_52163205/article/details/139749789