Java线程编程中Thread类的基础学习教程

Java线程编程中Thread类的基础学习教程

什么是Java线程?

在计算机科学中,线程是进程中的一段指令执行路径;或者说是CPU调度的最小单位。与进程相比,线程更加轻量级,可以提高CPU利用效率,充分发挥计算机的计算能力。在Java中,线程是指实现了java.lang.Thread类或者java.lang.Runnable接口的对象。

Thread类的基础知识

Java中的线程是通过java.lang.Thread类来实现的,Thread类是一个被公认的非常好用的类,可以利用它的一系列API来实现线程的管理。在Java中,一个程序默认就只有一个线程-主线程(main thread),而主线程可以通过创建其他线程的方式来实现并发执行。

在使用Thread类时,需要注意以下几个方面:

  1. 创建线程的两种方法:继承Thread类或者实现Runnable接口;
  2. 启动线程的方式: start()方法;
  3. 终止线程的方式:stop()方法已经被废弃,可以使用interrupt()isInterrupted()方法实现;
  4. 其他方法:sleep()yield()join()等。

继承Thread类的方式创建线程

继承Thread类创建线程非常简单,只需要重写run()方法并实例化对象即可。

public class MyThread extends Thread {
    private String threadName;

    public MyThread(String threadName) {
        this.threadName = threadName;
    }

    @Override
    public void run() {
        System.out.println(threadName + " is running.");
    }
}

在上述代码中,我们自定义了一个MyThread类,继承了Thread类,并在其构造方法中传递了线程名。在run()方法中实现了线程执行的具体内容。

为了启动线程,需要先实例化MyThread类,并调用其start()方法:

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

实现Runnable接口的方式创建线程

实现Runnable接口创建线程需要以下步骤:

  1. 定义一个类实现Runnable接口;
  2. 实现Runnable接口中的run()方法;
  3. 然后将该实现类的实例作为参数传递到Thread类的构造函数中;
  4. 最后启动线程。
public class MyRunnable implements Runnable {
    private String threadName;

    public MyRunnable(String threadName) {
        this.threadName = threadName;
    }

    @Override
    public void run() {
        System.out.println(threadName + " is running.");
    }
}

在上述代码中,我们自定义了一个MyRunnable类,实现了Runnable接口,并在其构造方法中传递了线程名。在run()方法中实现了线程执行的具体内容。

在实例化Thread类时需要传递MyRunnable的实例:

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

示例1:让两个线程先后执行

public class MyThread extends Thread {
    private String threadName;

    public MyThread(String threadName) {
        this.threadName = threadName;
    }

    @Override
    public void run() {
        System.out.println(threadName + " is running.");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t1 = new MyThread("Thread1");
        MyThread t2 = new MyThread("Thread2");
        t1.start();
        try {
            // t1线程执行完之后再执行t2线程
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t2.start();
    }
}

在上述案例中,我创建了两个线程MyThread t1MyThread t2,分别输出"Thread1 is running."和"Thread2 is running."信息。并通过t1.join()方法实现让Thread2等待Thread1执行完后再执行,从而保证了线程执行顺序。

示例2:利用Runnable实现线程同步和资源共享

public class MyRunnable implements Runnable {
    private int ticket = 10;

    @Override
    public void run() {
        // 此处同步锁为当前对象
        synchronized (this) {
            for (int i = 0; i < 10; i++) {
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "卖出了第" + ticket + "张票。");
                    ticket--;
                }
            }
        }
    }
}

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

在上述案例中,我们创建了一个MyRunnable类,共享了一个私有变量ticket,并实现了Runnable接口中的run()方法,在其中通过synchronized实现线程同步,保证了并发执行时ticket的值不会超过10。

Main类中,我创建了两个线程t1t2,共享了MyRunnable实例,分别执行了t1.start()t2.start()方法,最终输出了线程ID,以及每个线程所卖出的票数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程编程中Thread类的基础学习教程 - Python技术站

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

相关文章

  • 详解java中的互斥锁信号量和多线程等待机制

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

    多线程 2023年5月16日
    00
  • python多进程和多线程究竟谁更快(详解)

    针对这个话题,我将从以下几方面进行详细讲解: 概述:介绍Python多进程和多线程的概念、区别和联系。 多进程和多线程的性能测试:通过测试代码,分别比较Python多进程和多线程的性能,并得出结论。 示例说明:针对实际应用场景,分别演示多进程和多线程的使用方式和效果。 接下来我会一一详细解释。 1.概述 1.1 多进程和多线程的概念 在Python中,多进程…

    多线程 2023年5月17日
    00
  • Java 并发编程之ThreadLocal详解及实例

    Java 并发编程之ThreadLocal详解及实例攻略 什么是 ThreadLocal ThreadLocal 是 Java 并发包中的一个小工具,它允许我们创建本地线程变量。通俗点说,就是为每个线程创建一个自身独有的变量,每个线程只能访问自己独有的变量,而对于其他线程的变量是无法访问的。可以随时设置或获取本地线程变量的值,每个线程的操作都是相互独立的。 …

    多线程 2023年5月16日
    00
  • Python中多线程的创建及基本调用方法

    Python中的多线程是一种实现并发执行的机制,可以提高程序的性能和效率。以下是Python中多线程的创建及基本调用方法的详细攻略。 创建线程 Python中创建线程有两种方法,分别是继承Thread类和直接创建Thread实例。 继承Thread类 使用这种方法,只需要继承Thread类,并重写它的run()方法,即可创建一个线程。示例代码如下: from…

    多线程 2023年5月17日
    00
  • 详解C++ 共享数据保护机制

    详解C++ 共享数据保护机制攻略 什么是共享数据 共享数据是指多个线程同时访问同一数据,而且每个线程都可以修改数据。因为多个线程同时访问同一数据,所以需要额外的保护机制来避免数据竞争和错误的结果。 数据保护机制 常见的数据保护机制有: 1. 互斥锁(Mutex) 互斥锁是一种最常用的保护共享数据的方法,即通过加锁(lock)来保护共享数据。同一时间只有一个线…

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

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

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

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

    多线程 2023年5月17日
    00
  • Java并发编程之死锁相关知识整理

    Java并发编程之死锁相关知识整理 什么是死锁? 死锁是指两个或多个线程在执行过程中,因互相竞争资源而造成的一种互相等待的现象,若无外力干涉势将无法推进下去。 什么情况下会发生死锁? 当系统资源不足时,进程会因争夺资源而陷入僵局。若此时系统能够协调资源分配,以便令进程有序地进行,便可避免进程间死锁的发生。 在Java并发编程中,一般出现死锁的情况是因为线程之…

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