Java并发编程示例(一):线程的创建和执行

Java并发编程示例(一):线程的创建和执行

前言

Java是一门支持多线程编程的语言,多线程编程可以有效地提高程序的执行效率,特别是在涉及到网络编程、I/O操作以及复杂的计算任务时。本篇文章将会介绍Java中如何创建线程以及如何执行线程。

Java中的线程

Java中的线程是通过Thread类来实现的。在Java中创建线程有两种方式:继承Thread类和实现Runnable接口。前者需要重写Thread类中的run()方法,后者需要实现Runnable接口中的run()方法。

//继承Thread类创建线程
public class MyThread extends Thread {
    public void run() {
        System.out.println("This is a thread created by extending Thread class.");
    }
}

//实现Runnable接口创建线程
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("This is a thread created by implementing Runnable interface.");
    }
}

创建线程并启动线程

在创建了线程对象之后,需要使用start()方法来启动线程。调用start()方法后,线程进入就绪状态,等待CPU调度执行。

public class Main {
    public static void main(String[] args) {
        //创建线程并启动线程
        MyThread t1 = new MyThread();
        t1.start();

        MyRunnable r1 = new MyRunnable();
        Thread t2 = new Thread(r1);
        t2.start();
    }
}

这样就可以成功地创建并启动两个线程。

示例一:多线程排序

下面我们通过一个简单的排序示例来说明多线程的作用。在这个示例中,我们将会创建两个线程,一个线程用来对数组进行从大到小排序,另一个线程用来对数组进行从小到大排序。在某些情况下,我们需要同时对数组进行不同顺序的排序,这就需要使用多线程。

public class Sort {

    public static void main(String[] args) {
        int[] arr = {4, 5, 8, 9, 1, 3, 6, 2, 7, 0};

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                Arrays.sort(arr);
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                Arrays.sort(arr);
                for (int i = 0; i < arr.length / 2; i++) {
                    int temp = arr[i];
                    arr[i] = arr[arr.length - 1 - i];
                    arr[arr.length - 1 - i] = temp;
                }
            }
        });

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

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Arrays.toString(arr));
    }
}

在上面的代码中,我们首先定义了一个长度为10的整型数组,然后创建了两个线程t1和t2,t1用来对数组进行从小到大排序,t2用来对数组进行从大到小排序。最后,我们使用了t1.join()和t2.join()方法保证了t1和t2线程执行完毕后再获取数组的值并输出到控制台。

示例二:多线程模拟银行取款

下面我们来看一个另一个示例:多线程模拟银行取款。在这个示例中,假设有一对夫妻在一家银行开了一个共同账户,他们一起来到银行取款,现在需要模拟这个过程。

public class BankAccount {

    private int balance = 10000;

    public synchronized void withdraw(int amount) {
        if (balance >= amount) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            balance -= amount;
            System.out.println(Thread.currentThread().getName() + " withdrew " + amount + ", balance is " + balance);
        } else {
            System.out.println(Thread.currentThread().getName() + " tried to withdraw " + amount + ", balance is not enough.");
        }
    }
}

public class WithdrawThread implements Runnable {

    private BankAccount bankAccount;
    private int withdrawAmount;

    public WithdrawThread(BankAccount bankAccount, int withdrawAmount) {
        this.bankAccount = bankAccount;
        this.withdrawAmount = withdrawAmount;
    }

    @Override
    public void run() {
        bankAccount.withdraw(withdrawAmount);
    }
}

public class Main {

    public static void main(String[] args) {
        BankAccount bankAccount = new BankAccount();
        Thread t1 = new Thread(new WithdrawThread(bankAccount, 5000), "Jack");
        Thread t2 = new Thread(new WithdrawThread(bankAccount, 4000), "Jane");
        Thread t3 = new Thread(new WithdrawThread(bankAccount, 3000), "Jeff");

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

在上面的示例中,我们首先定义了一个名为BankAccount的类,用来表示夫妻共同的账户。BankAccount类中只有一个withdraw方法,方法中首先做的是判断余额是否足够,如果足够,则让线程休眠一会儿(模拟网络延迟等情况),然后进行相应的取款操作;如果余额不足,则直接输出提示信息。

接下来我们定义了一个WithdrawThread类,该类用来表示取款线程。在构造方法中我们传入了一个BankAccount实例和一个取款金额,然后在run()方法中调用bankAccount的withdraw方法。

最后,在Main类中,我们创建了三个取款线程t1、t2和t3,每个线程分别要取5000、4000和3000元。运行程序后输出的结果如下:

Jack withdrew 5000, balance is 5000
Jane withdrew 4000, balance is 1000
Jeff tried to withdraw 3000, balance is not enough.

从上面的输出结果可以看出,三个线程都访问了同一个BankAccount实例,但是由于使用了同步锁,线程是依次进行的,比如当Jack线程在进行withdraw方法时,其他线程都要等待Jack线程结束后才开始执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java并发编程示例(一):线程的创建和执行 - Python技术站

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

相关文章

  • 浅谈java.util.concurrent包中的线程池和消息队列

    浅谈java.util.concurrent包中的线程池和消息队列 什么是java.util.concurrent包 Java的java.util.concurrent包提供了高效的、多线程的编程实现。这个包内置了一系列的并发编程工具,如线程池、阻塞队列、同步器等,使得Java程序员可以轻松地编写具有并行或者异步执行能力的程序。 线程池的原理与实现 线程池(…

    多线程 2023年5月17日
    00
  • IIS Web服务器支持高并发设置方法详解

    IIS Web服务器支持高并发设置方法详解 在应对高并发场景下,IIS Web服务器的配置是至关重要的。本文将介绍如何通过设置来提高IIS的并发处理能力。 1. 修改IIS属性设置 第一步是修改IIS属性设置,以提高服务器并发处理能力。可以按以下步骤操作: 在控制面板中找到“管理工具”,然后点击“Internet 信息服务(IIS)管理器”进入IIS配置界面…

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

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

    多线程 2023年5月17日
    00
  • java高并发InterruptedException异常引发思考

    下面就是详细讲解“java高并发InterruptedException异常引发思考”的完整攻略。 什么是InterruptedException? 在Java编程中,InterruptedException通常是由于线程等待和执行过程中出现中断时触发的异常。Interrupted异常是一个受检查的异常,在代码中必须进行catch处理或者往上抛出。当一个线程…

    多线程 2023年5月17日
    00
  • 详解进程同步与互斥机制

    详解进程同步与互斥机制 什么是进程同步和互斥? 在多进程环境下,多个进程之间共享计算机资源,例如共享内存区域。有时多个进程需要访问同一资源,这时候需要协调它们之间的访问,以免数据出现混乱。 进程同步是指协调多个进程之间的活动以达到一致的状态。进程互斥是指规范多个进程在不同时间访问资源的竞争环境,以防止它们同时访问同一资源而导致不可预测的后果。 进程同步的方法…

    多线程 2023年5月17日
    00
  • Python技巧之四种多线程应用分享

    下面我将详细讲解“Python技巧之四种多线程应用分享”的完整攻略,并分享两个示例。 Python技巧之四种多线程应用分享 概述 多线程是一种常见的编程技术,可以提高程序的并发性,从而加速程序的运行速度。Python中有多种方式可以实现多线程,并且每种方式都有其优缺点和适用场景。 本文主要介绍Python中四种常见的多线程应用方式,并且结合具体的示例代码进行…

    多线程 2023年5月17日
    00
  • MySQL高并发生成唯一订单号的方法实现

    当MySQL数据库面对高并发情况下生成唯一订单号时,我们可以采用以下方法实现: 方案一:使用UUID UUID是一个用于标识信息的128位字长的数字。在常见的实现中,总共有36个字符,其中有32个16进制字符,以及4个连接号。生成UUID可以使用MySQL提供的UUID()函数。在插入订单数据时,可以在SQL语句中调用UUID()函数,确保每个订单都有唯一的…

    多线程 2023年5月17日
    00
  • 易语言实现多线程计算的代码

    下面是详细讲解“易语言实现多线程计算的代码”的完整攻略。 什么是多线程? 多线程是指在一个程序中,可以同时运行多个线程(线程、任务、工作单元)。每个线程都可以完成一部分独立的工作,可能是并行执行的,相互之间也可以通过协调完成更多的处理。 在计算机操作系统中,线程是比进程更小的、更基本的单位,线程可以共享内存中的数据,上下文切换所需要的时间较少,因此在开发中使…

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