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多线程之wait(),notify(),notifyAll()的详解分析

    Java多线程之wait(), notify(), notifyAll()的详解分析 在Java多线程编程中,wait(), notify(), notifyAll()是非常重要的方法。这三个方法都是用于线程间的协作,可以让线程在合适的时候等待或唤醒其他线程,实现高效的资源共享和数据交换。本文将详细介绍wait(), notify(), notifyAll(…

    多线程 2023年5月16日
    00
  • Go并发控制WaitGroup的使用场景分析

    Go并发控制WaitGroup的使用场景分析 Go语言的并发模型是通过goroutine和channel实现的。goroutine是轻量级线程,可以在同一进程的多个线程之间切换执行。channel提供了goroutine之间的通信和同步机制。在使用goroutine时,我们很常用到sync.WaitGroup来控制并发。本文将详细讲解WaitGroup的使用…

    多线程 2023年5月16日
    00
  • 基于线程、并发的基本概念(详解)

    基于线程、并发的基本概念(详解) 什么是线程和并发? 线程 线程是程序执行的一条路径,每个线程都是独立的,具有自己的栈空间和程序计数器。同一个程序中如果有多个线程,它们可以并发执行,即同时执行,换句话说,多线程可以用来实现程序的并发性。 并发 并发,指的是系统能够同时处理多个任务的能力。例如,多个线程在同时执行不同的任务,或者同一个线程在同时执行多个任务,都…

    多线程 2023年5月17日
    00
  • c语言多线程编程使用示例

    C语言多线程编程使用示例攻略 本文旨在介绍 C 语言多线程编程的使用方法和示例,帮助读者理解多线程的概念和实际应用场景。 多线程编程概述 多线程是指在单个程序中同时运行多个不同的线程,在操作系统中相对独立的执行流程。在多线程编程中,一个线程可以独立执行任务,也可以与其他线程协作完成任务。 多线程的优点 提高程序的并发性和并行性。 能够更好的利用多核处理器的性…

    多线程 2023年5月17日
    00
  • 如何在Python中编写并发程序

    一、什么是并发编程 并发编程是指程序同时执行多个任务的一种编程方式。在Python中,这通常通过多线程、多进程和协程来实现。 在多线程、多进程和协程中,每个任务都是独立的,它们可以在不影响其他任务的情况下并发执行,从而提高程序的效率。 二、如何在Python中编写多线程程序 使用threading模块创建线程 Python中内置的threading模块提供了…

    多线程 2023年5月17日
    00
  • Java 详解循环屏障CyclicBarrier如何实现多线程分段等待执行完成

    这里将会详细讲解Java中循环屏障CyclicBarrier如何实现多线程分段等待执行完成,我们首先需要了解CyclicBarrier的基本概念和用法,然后再通过两个示例来说明CyclicBarrier的使用。 1. CyclicBarrier概念和用法 1.1 概念 CyclicBarrier是Java中一个同步机制,允许一组线程相互等待,直到所有线程都到…

    多线程 2023年5月17日
    00
  • .NET并发编程之函数闭包

    .NET并发编程是一个非常广泛的话题,其中函数闭包是一个非常重要的部分。在本篇攻略中,我将详细讲解什么是函数闭包,它的用途以及如何在.NET环境中使用它来实现并发编程。 什么是函数闭包 先从概念上来讲,函数闭包是一种特殊的函数,它可以访问其外部环境中的变量和函数,即使这些变量和函数已经不再存在,也可以继续使用。它通常用来创建函数工厂,或者是实现某些高级编程模…

    多线程 2023年5月17日
    00
  • php并发对MYSQL造成压力的解决方法

    当PHP应用程序需要处理大量读写数据库操作时,如何处理高并发对MYSQL数据库的压力成为了一个非常重要的问题。以下是几个可以解决此类问题的方法。 1. 数据库连接池 数据库连接池是一种通过缓存数据库连接对象的技术,来减少应用程序创建和销毁连接对象的操作,从而避免了频繁地建立数据库连接的开销,减轻了数据库服务器的压力。使用数据库连接池可以提高PHP应用的并发性…

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