Java基础:彻底搞懂java多线程

Java基础:彻底搞懂Java多线程

前言

多线程作为Java重要的特性,其重要性不言而喻。本文将从以下几个方面系统讲解Java多线程的知识,包括:

  • 什么是多线程
  • 线程的状态
  • 创建线程的方式
  • 线程池
  • 线程同步与锁
  • 并发编程相关类
  • 示例

什么是多线程

多线程即在一个程序中同时运行多个线程,这些线程可以并发执行。在Java中,用Thread类、Runnable接口以及Executor框架来实现多线程。

多线程的好处在于可以充分利用CPU资源,并且可以提高程序的响应速度、解决一些复杂的任务,比如Web服务器中可以处理多个请求。

线程的状态

Java线程一般有以下五种状态:

  • 新建(New):线程创建后,尚未启动。
  • 运行(Runnable):线程正在Java虚拟机中运行的状态。
  • 阻塞(Blocked):等待监视器锁、IO等操作导致线程暂停执行的状态。
  • 等待(Wait):进入该状态的线程需要等待其他线程的一些操作,比如join()方法、sleep()方法等。等待期间该线程不会持有CPU资源,处于阻塞状态。
  • 终止(Terminated):线程执行完毕或被强制终止的状态。

创建线程的方式

继承Thread类实现

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("This is MyThread");
    }
}

public static void main(String[] args) {
    MyThread myThread = new MyThread();
    myThread.start(); // 启动线程
}

实现Runnable接口实现

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("This is MyRunnable");
    }
}

public static void main(String[] args) {
    MyRunnable myRunnable = new MyRunnable();
    Thread thread = new Thread(myRunnable);
    thread.start(); // 启动线程
}

实现Callable接口实现(可以获取返回值)

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "This is MyCallable";
    }
}

public static void main(String[] args) throws ExecutionException, InterruptedException {
    MyCallable myCallable = new MyCallable();
    FutureTask<String> futureTask = new FutureTask<>(myCallable);
    Thread thread = new Thread(futureTask);
    thread.start(); // 启动线程
    String result = futureTask.get(); // 获取返回值
    System.out.println(result);
}

线程池

线程池可以节省线程启动和销毁的开销,从而提升程序性能。

ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++) {
    executor.execute(new MyTask());
}
executor.shutdown();

线程同步与锁

当多个线程同时访问同一资源时容易出现问题,为了避免线程安全问题,需要用到线程同步和锁。

以下是使用synchronized实现同步:

public synchronized void add(int num) {
    this.count += num;
}

以下是使用Lock接口实现同步:

Lock lock = new ReentrantLock();
public void add(int num) {
    lock.lock();
    try {
        this.count += num;
    } finally {
        lock.unlock();
    }
}

并发编程相关类

Java并发编程相关类主要包括:

  • CountDownLatch:倒计时门闩
  • CyclicBarrier:循环栅栏
  • Semaphore:信号量
  • BlockingQueue:阻塞队列等

示例

以下是一个简单的生产者和消费者示例,使用阻塞队列来保证线程安全:

public static void main(String[] args) throws InterruptedException {
    BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(10);
    Producer producer = new Producer(blockingQueue);
    Consumer consumer = new Consumer(blockingQueue);
    Thread thread1 = new Thread(producer);
    Thread thread2 = new Thread(consumer);
    thread1.start();
    thread2.start();
    thread1.join();
    thread2.join();
}

static class Producer implements Runnable {
    private BlockingQueue<Integer> blockingQueue;

    Producer(BlockingQueue<Integer> blockingQueue) {
        this.blockingQueue = blockingQueue;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                blockingQueue.put(i);
                System.out.println("生产: " + i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

static class Consumer implements Runnable {
    private BlockingQueue<Integer> blockingQueue;

    Consumer(BlockingQueue<Integer> blockingQueue) {
        this.blockingQueue = blockingQueue;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            try {
                int num = blockingQueue.take();
                System.out.println("消费: " + num);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

以上就是Java多线程的一些基础知识,希望能对大家有所帮助。

阅读剩余 76%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基础:彻底搞懂java多线程 - Python技术站

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

相关文章

  • Go保证并发安全底层实现详解

    Go保证并发安全底层实现详解 什么是并发安全 并发安全是指在多线程/多协程同时访问共享变量时,不会出现数据的不一致、不完整、未定义行为等问题。在多核CPU等多核心系统中,我们通常会采用并发编程的方式提高程序的性能,但是多线程/多协程的并发访问也会引发一些并发安全的问题。因此,为了保证程序的正确执行,我们需要确保程序在并发访问共享变量时仍然保持正确性,这就需要…

    多线程 2023年5月17日
    00
  • C#线程队列用法实例分析

    C#线程队列用法实例分析 1. 什么是线程队列 线程队列指的是一种数据结构,它遵循“先进先出(FIFO)”的原则,即第一个入队的元素也会是第一个被出队的元素。在C#中,我们可以使用Queue<T>类来实现线程队列。 2. 线程队列的主要用途 线程队列常用于多线程编程中,以便按照一定顺序访问共享资源,避免数据竞争等多线程并发问题。 3. C#中线程…

    多线程 2023年5月16日
    00
  • Java多线程高并发中的Fork/Join框架机制详解

    Java多线程高并发中的Fork/Join框架机制详解 简介 Fork/Join框架是Java7中新增加的一个并行运算框架,是一种基于任务的并行模式,能够将一个大任务分支成多个小任务并行计算,然后将计算结果合并得到一个最终结果。在高并发和大数据应用场景下,Fork/Join框架可以提高程序的性能和运行效率。 框架机制 Fork/Join框架的核心是ForkJ…

    多线程 2023年5月16日
    00
  • Java线程创建(卖票),线程同步(卖包子)的实现示例

    Java线程创建和线程同步是多线程编程必须掌握的核心知识点。下面将介绍Java线程创建和线程同步的实现示例。 Java线程创建的实现示例 Java线程创建通常有两种方式:继承Thread类和实现Runnable接口。 继承Thread类的实现示例 代码示例: public class TicketSeller extends Thread { private…

    多线程 2023年5月17日
    00
  • python 实现多线程的三种方法总结

    下面我将详细讲解“Python实现多线程的三种方法总结”的完整攻略。 一、多线程简介 多线程(Multithreading)是指在同一进程中有多个不同的线程同时存在,并且能够被操作系统独立的调度执行。Python提供了多种方法来实现多线程,解决CPU瓶颈问题,提高程序的运行效率。 二、Python实现多线程的三种方法 Python实现多线程的方式有三种: 1…

    多线程 2023年5月17日
    00
  • Java让多线程按顺序执行的几种方法

    Java中多线程是独立运行的,并发执行,遵循自己的时间表。但是,有时候需要按照特定的顺序来执行多个线程,以便其运行方式与编程要求相适应。本文将介绍Java让多线程按顺序执行的几种方法。 方法1.依靠join()方法 在Java中,线程可以使用join()方法等待另一个线程的完成,直到当前线程已经结束执行或等到timeout毫秒。这个方法只能在共享同一个对象的…

    多线程 2023年5月17日
    00
  • 详解java中的互斥锁信号量和多线程等待机制

    详解Java中的互斥锁、信号量和多线程等待机制 互斥锁 介绍 互斥锁(Mutual Exclusion Lock),简称 Mutex,是用于保护共享资源的一种机制。当多个线程同时访问共享资源时,互斥锁可以确保同一时刻只有一个线程可以访问该资源。在 Java 中,互斥锁可以通过 synchronized 关键字来实现。 示例 下面是一个使用互斥锁的示例,其中 …

    多线程 2023年5月16日
    00
  • python 多线程应用介绍

    Python 多线程应用介绍 什么是多线程? 多线程是指同时运行多个线程(thread)而每个线程运行的代码互不干扰。线程是进程(process)中的一个实体,是进程中的一个执行序列。一个进程可以由多个线程并发执行,每个线程都是独立的,同时共享父进程的资源。 为什么使用多线程? 多线程可以提高Python程序的运行效率,让长时间的任务在后台运行,不会阻碍主线…

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