Java 线程相关总结

Java 线程相关总结

线程的概念

线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。

Java 中的线程

线程的创建

Java 中可以通过继承 Thread 类或实现 Runnable 接口来创建线程。

继承 Thread 类

public class MyThread extends Thread {
    @Override
    public void run() {
        // 线程需要执行的任务
    }
}

MyThread myThread = new MyThread();
myThread.start();

实现 Runnable 接口

public class MyRunnableTask implements Runnable {
    @Override
    public void run() {
        // 线程需要执行的任务
    }
}

MyRunnableTask myTask = new MyRunnableTask();
Thread thread = new Thread(myTask);
thread.start();

线程的状态

Java 线程有几种状态:

  • NEW:线程新建但是还没有开始执行
  • RUNNABLE:线程正在执行
  • BLOCKED:线程阻塞,正在等待获取锁
  • WAITING:线程在等待,等待其他线程发出通知(notify、notifyAll)
  • TIMED_WAITING:线程在等待,等待一定的时间(sleep、wait)
  • TERMINATED:线程执行完成或者被中断

线程的状态转换

线程状态转换的示例:

public class MyTask implements Runnable {
    private int count = 0;

    @Override
    public void run() {
        synchronized(this) {
            count ++;
            System.out.println(Thread.currentThread().getName() + "执行第" + count + "次");
            if (count == 3) {
                try {
                    System.out.println("线程等待...");
                    wait(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

MyTask myTask = new MyTask();
new Thread(myTask, "线程1").start();
new Thread(myTask, "线程2").start();

执行结果:

线程1执行第1次
线程2执行第1次
线程1执行第2次
线程2执行第2次
线程1执行第3次
线程等待...
线程2执行第3次

线程的同步

Java 中可以通过 synchronized 关键字来实现线程的同步。synchronized 可以用来修饰方法或者代码块。

public synchronized void syncMethod() {
    // 待同步的代码
}

public void syncBlock() {
    synchronized(this) {
        // 待同步的代码
    }
}

线程的通信

Java 中可以通过 wait()notify()notifyAll() 等方法来实现线程之间的通信。这些方法都需要放在 synchronized 块中,因为只有获得了锁后,才可以调用这些方法。

public class MyTask implements Runnable {
    private boolean flag = false;

    public synchronized void taskA() {
        while(!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + "开始执行任务A");
    }

    public synchronized void taskB() {
        flag = true;
        notifyAll();
        System.out.println(Thread.currentThread().getName() + "开始执行任务B");
    }

    @Override
    public void run() {
        if (Thread.currentThread().getName().equals("线程1")) {
            taskA();
        } else {
            taskB();
        }
    }
}

MyTask myTask = new MyTask();
new Thread(myTask, "线程1").start();
new Thread(myTask, "线程2").start();

执行结果:

线程2开始执行任务B
线程1开始执行任务A

总结

本文介绍了 Java 中线程的相关概念和使用方法,包括线程的创建、线程的状态、线程的同步、线程的通信等方面。在实际开发中,需要合理地处理好线程的状态和同步问题,确保程序的正确性和性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 线程相关总结 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 举例解析Java多线程编程中需要注意的一些关键点

    下面是举例解析Java多线程编程中需要注意的一些关键点的攻略。 标题 Java多线程编程中需要注意的一些关键点 起因 Java多线程编程是Java程序员必备的技能之一,也是Java语言特有的特性。但是,由于多线程编程涉及到线程安全、锁机制、可见性等复杂问题,因此在编写多线程程序时,我们需要注意一些关键点,以避免出错、提高程序的性能和可靠性。 注意点 线程安全…

    多线程 2023年5月17日
    00
  • Java线程池的几种实现方法及常见问题解答

    Java线程池的几种实现方法及常见问题解答 什么是线程池 线程池是一种预处理一定数量的线程,并将它们存放在池子中,以便随时执行多个任务,而不用反复创建新线程或销毁已经没有用的线程。线程池线程的数量可以根据需要自动增加或减少,在使用线程池时,我们只需要向池子中添加执行的任务即可,任务会自动分配到池子中的线程执行,执行完成后,线程不会被销毁,而是放回池子中,供其…

    多线程 2023年5月17日
    00
  • 带你快速搞定java并发库

    带你快速搞定Java并发库 为什么要学习Java并发库 多线程是面向对象编程中非常重要的一个概念,能够很好地提高程序运行效率,特别是在大型应用中。在Java中,提供了Java并发库来实现多线程编程,同时能够避免线程安全问题。学习了Java并发库,可以更好地编写高质量的多线程程序。 学习Java并发库的基本知识 1. 线程的创建 Java并发库中的线程创建使用…

    多线程 2023年5月16日
    00
  • Python多线程入门学习

    Python多线程入门学习 多线程指的是在一个程序中同时运行多个线程,同时处理不同的任务,从而提高程序的效率。Python支持多线程编程,并且在实际应用中也十分常见。本文将介绍Python多线程编程的基本原理、注意事项以及使用场景。 什么是线程 线程是一个轻量级的执行单元,它包含了代码指针、寄存器、栈以及资源占用等等。在多线程编程中,程序会创建多个线程同时执…

    多线程 2023年5月17日
    00
  • 进程和线程区别是什么 一篇文章简单介绍进程和线程的区别

    进程和线程区别是什么 基本定义 进程和线程都是计算机程序运行的基本单位。进程是CPU资源分配的独立单位,每个进程都拥有自己的地址空间、代码、数据和堆栈等资源;线程则是进程的组成部分,一个进程可以包含多个线程,它们共享进程的地址空间和资源。 区别 轻量级 相对于进程而言,线程是一个更轻量级的执行单位。因为线程共享了进程的地址空间,所以线程的创建、上下文切换等开…

    多线程 2023年5月16日
    00
  • C#中的多线程多参数传递详解

    我们来详细讲解C#中的多线程多参数传递问题。 一、使用委托来传递多个参数 在C#中,我们可以使用委托来传递多个参数。具体步骤如下: 定义委托类型,包含所有需要传递的参数 public delegate void MyDelegate(string str1, int num1); 定义主函数,作为委托的执行体 public static void MyFun…

    多线程 2023年5月17日
    00
  • Java多线程编程综合案例详解

    下面是针对“Java多线程编程综合案例详解”的完整攻略,帮助读者深入了解Java多线程编程。 Java多线程编程综合案例详解 简介 多线程编程是Java开发中非常重要的一个部分,能有效地提高程序的运行效率。本文介绍一个基于Java多线程技术的综合案例,主要包括案例的背景、功能、流程等内容。 案例背景 假设有一个银行系统,要求支持并发访问,其中主要包含两个功能…

    多线程 2023年5月17日
    00
  • 关于SpringBoot 使用 Redis 分布式锁解决并发问题

    关于SpringBoot使用Redis分布式锁解决并发问题的攻略可以分为以下几个步骤: 第一步:引入Redis相关依赖 在开发SpringBoot应用时,我们需要在pom.xml文件中添加对Redis的支持,可以参考下面的依赖: <dependency> <groupId>org.springframework.boot</gr…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部