java——多线程基础

Java-多线程基础

什么是多线程

在程序中,一个线程就是一条执行路径。一个程序默认从主线程开始执行。如果程序中开辟了多个线程,则程序就会多个线程同时执行。

多线程可以大幅度提高程序的效率,因为多个线程可以同时执行,而不是一个一个依次执行。

多线程的实现

Java中实现多线程主要有两种方式,一种是继承Thread类,一种是实现Runnable接口。

继承Thread类

public class MyThread extends Thread {
    @Override
    public void run() {
        // 实现多线程的代码
    }
}

在实现类中重写run方法,并在该方法中实现多线程的具体代码,然后通过调用start方法来启动线程。

public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

实现Runnable接口

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 实现多线程的代码
    }
}

在实现类中同样重写run方法,并在该方法中实现多线程的具体代码。这时需要在创建线程时将该实现类作为参数传入Thread类中。

public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

多线程的基本方法

Java多线程中,常用的线程方法有:

方法 描述
start 启动线程,并执行run方法
join 线程等待,让其他线程等待该线程执行完毕
sleep 让线程休眠指定的时间
yield 让出CPU资源,使其他线程可以被调度

这里简单介绍一下常用的线程方法sleep。

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(getName() + "线程正在运行...");
            try {
                Thread.sleep(1000); // 线程休眠1秒钟
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在该例子中,使用了sleep方法让线程休眠1秒钟,然后再继续执行下一个循环。

多线程的状态

Java多线程中,线程会存在以下几种状态:

  • 新建状态:当一个Thread类或其子类的对象被声明并创建时,该线程处于新建状态。
  • 就绪状态:当调用start方法之后,该线程处于就绪状态,等待调度器调度执行。
  • 运行状态:当调度器从多个就绪状态的线程中选择一个线程调用其run方法时,该线程处于运行状态。
  • 阻塞状态:线程因为某种原因放弃CPU,暂时停止运行,并处于阻塞状态。直到线程进入就绪状态,才有机会转到运行状态。
  • 死亡状态:线程完成工作或者因异常退出run方法时,该线程结束,并处于死亡状态。

示例说明

示例1

下面的代码用两个线程交替输出1至10的数字:

public class Main {
    private static Object lock = new Object(); // 初始化锁

    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    for (int i = 1; i <= 10; i += 2) {
                        System.out.println(Thread.currentThread().getName() + " " + i);
                        lock.notify(); // 唤醒另一个线程
                        try {
                            lock.wait(); // 让出CPU控制权,并释放锁
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    lock.notify(); // 唤醒另一个线程
                }
            }
        }, "线程1");

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    for (int i = 2; i <= 10; i += 2) {
                        System.out.println(Thread.currentThread().getName() + " " + i);
                        lock.notify(); // 唤醒另一个线程
                        try {
                            lock.wait(); // 让出CPU控制权,并释放锁
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    lock.notify(); // 唤醒另一个线程
                }
            }
        }, "线程2");

        t1.start();
        t2.start();
    }
}

在该例子中,我们使用了一个Object类型的对象作为锁来保证线程的同步。每个线程执行输出完后,都调用notify方法唤醒另一个线程来执行输出任务,在执行输出任务之前,又调用了wait方法让出了CPU控制权,并释放锁。通过这种方式,两个线程实现了交替输出的效果。

示例2

下面的代码使用线程池的方式进行多线程的实现。

public class Main {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + "正在执行。");
                }
            });
        }
        executorService.shutdown();
    }
}

在该例子中,我们使用了线程池的方式进行多线程的实现。通过创建一个线程池,然后提交任务给线程池来执行,最后用shutdown方法关闭线程池,实现了多线程的优雅退出。

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

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

相关文章

  • 详解PHP服务器如何在有限的资源里最大提升并发能力

    当PHP服务器面对大量用户请求时,如何在有限的资源里提升其并发能力是一个非常关键的问题。下面是一些具体做法以及案例分析,可以帮助提升PHP服务器的并发能力。 1. 改善代码架构 优化代码架构可以有效提高服务器的性能。具体而言,可以针对如下几个方面进行优化。 1.1 精简代码 减少无用的代码和逻辑,缩小代码体积,可以有效减少服务器的负担,提高响应速度。比如,可…

    多线程 2023年5月16日
    00
  • c++11 多线程编程——如何实现线程安全队列

    标题1:c++11多线程编程——如何实现线程安全队列 转眼间,多线程编程已经成为了现代软件开发中必不可少的一项技能,而线程安全队列则是其中非常重要的一个思路,下面我们就来详细讲解一下如何在c++11中实现线程安全队列。 标题2:实现方法1:使用锁 使用锁是最常见、最简单的实现线程安全队列的方法。 示例1: #include <queue> #in…

    多线程 2023年5月17日
    00
  • C#多线程之线程池(ThreadPool)

    C#多线程之线程池(ThreadPool) 在C#中,使用多线程可以提升程序的性能,提高程序的响应速度。然而,创建线程是有一定开销的,如果需要大量创建线程,这会降低系统的性能,因而引入了线程池(ThreadPool)的概念。线程池利用了线程的复用,重复利用已经存在的线程,在一定程度上减少了系统的开销。 在C#中,线程池提供了ThreadPool类,可以使用其…

    多线程 2023年5月17日
    00
  • Java并发系列之CyclicBarrier源码分析

    首先我要解释一下什么是CyclicBarrier。CyclicBarrier是一种在多线程中实现控制并发的同步工具,也可以看作是一种倒计数器。它的作用是允许一组线程在某个时刻全部到达一个屏障点,然后它们可以相互等待,直到所有的线程都到达这个屏障点后一起继续执行。我们可以使用Java的CyclicBarrier类来实现这个功能。 下面是这个攻略的详细步骤: 一…

    多线程 2023年5月16日
    00
  • Java多线程实现的两种方式

    下面是详细的Java多线程实现的两种方式攻略: 一、继承Thread类 继承Thread类是Java多线程实现的一种方式。在这种方式中,我们需要重写Thread类的run()方法,该方法是线程的业务逻辑,在run()方法中完成线程的操作即可。 下面是一个代码示例: public class MyThread extends Thread { @Overrid…

    多线程 2023年5月17日
    00
  • C#网络编程基础之进程和线程详解

    C#网络编程基础之进程和线程详解 什么是进程和线程? 在计算机中,程序的执行过程是由进程和线程来完成的。进程是程序的一次执行过程,是操作系统对正在运行的程序的一种抽象,是分配和管理系统资源的最小单位。一个进程拥有一个独立的虚拟地址空间、堆、栈、文件句柄等资源。而线程是指进程中的一个执行单元,每个线程都有自己的执行路径、局部变量、运行状态等,是CPU调度的基本…

    多线程 2023年5月16日
    00
  • C++ 多线程之互斥量(mutex)详解

    C++ 多线程之互斥量(mutex)详解 什么是互斥量? 在C++中,当多个线程同时访问共享资源时,可能会发生数据冲突或数据竞争的问题,导致程序出错。互斥量就是一种保持互斥、防止数据冲突的机制。在使用互斥量时,只有获取了互斥量的线程才能访问被保护的共享资源,其他线程必须等待。当获取互斥量的线程访问结束并释放互斥量后,其他线程才能继续获取互斥量并访问共享资源。…

    多线程 2023年5月17日
    00
  • Java并发系列之ReentrantLock源码分析

    当然,我很愿意为您讲解《Java并发系列之ReentrantLock源码分析》的完整攻略。 Java并发系列之ReentrantLock源码分析 一、ReentrantLock概述 ReentrantLock是Java提供的一种基于互斥锁的同步机制,它比synchronized更加灵活和强大,能够支持更复杂的同步需求。在Java并发编程中,Reentrant…

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