`

Java多线程初学者指南(2):用Thread类创建线程

阅读更多
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下:

public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize); 


    Runnable target
    实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。

    String name
    线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名子,线程就使用默认的线程名:Thread-N,N是线程建立的顺序,是一个不重复的正整数。

    ThreadGroup group
    当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。关于线程组的细节将在后面的章节详细讨论。

   long stackSize
    线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB.在x86平台下,默认的线程栈大小是12KB.

    一个普通的Java类只要从Thread类继承,就可以成为一个线程类。并可通过Thread类的start方法来执行线程代码。虽然Thread类的子类可以直接实例化,但在子类中必须要覆盖Thread类的run方法才能真正运行线程的代码。下面的代码给出了一个使用Thread类建立线程的例子:

  package mythread;
  
  public class Thread1 extends Thread
  {
      public void run()
      {
          System.out.println(this.getName());
      }
      public static void main(String[] args)
      {
          System.out.println(Thread.currentThread().getName());
          Thread1 thread1 = new Thread1();
          Thread1 thread2 = new Thread1 ();
          thread1.start();
          thread2.start();
      }
  } 


    上面的代码建立了两个线程:thread1和thread2.上述代码中的005至008行是Thread1类的run方法。当在014和015行调用start方法时,系统会自动调用run方法。在007行使用this.getName()输出了当前线程的名字,由于在建立线程时并未指定线程名,因此,所输出的线程名是系统的默认值,也就是Thread-n的形式。在011行输出了主线程的线程名。

    上面代码的运行结果如下:

main
Thread-0
Thread-1 


    从上面的输出结果可以看出,第一行输出的main是主线程的名子。后面的Thread-1和Thread-2分别是thread1和thread2的输出结果。

    注意:任何一个Java程序都必须有一个主线程。一般这个主线程的名子为main.只有在程序中建立另外的线程,才能算是真正的多线程程序。也就是说,多线程程序必须拥有一个以上的线程。

    Thread类有一个重载构造方法可以设置线程名。除了使用构造方法在建立线程时设置线程名,还可以使用Thread类的setName方法修改线程名。要想通过Thread类的构造方法来设置线程名,必须在Thread的子类中使用Thread类的public Thread(String name)构造方法,因此,必须在Thread的子类中也添加一个用于传入线程名的构造方法。下面的代码给出了一个设置线程名的例子:

  package mythread;
  
  public class Thread2 extends Thread
  {
      private String who;
  
      public void run()
      {
          System.out.println(who + ":" + this.getName());
      }
      public Thread2(String who)
      {
          super();
          this.who = who;
      }
      public Thread2(String who, String name)
      {
          super(name);
          this.who = who;
      }
      public static void main(String[] args)
      {
          Thread2 thread1 = new Thread2 ("thread1", "MyThread1");
          Thread2 thread2 = new Thread2 ("thread2");
          Thread2 thread3 = new Thread2 ("thread3");
          thread2.setName("MyThread2");
          thread1.start();
          thread2.start();
          thread3.start();
      }


在类中有两个构造方法:

    第011行:public sample2_2(String who)
    这个构造方法有一个参数:who.这个参数用来标识当前建立的线程。在这个构造方法中仍然调用Thread的默认构造方法public Thread( )。

    第016行:public sample2_2(String who, String name)
    这个构造方法中的who和第一个构造方法的who的含义一样,而name参数就是线程的名名。在这个构造方法中调用了Thread类的public Thread(String name)构造方法,也就是第018行的super(name)。

    在main方法中建立了三个线程:thread1、thread2和thread3.其中thread1通过构造方法来设置线程名,thread2通过setName方法来修改线程名,thread3未设置线程名。

    运行结果如下:

thread1:MyThread1
thread2:MyThread2
thread3:Thread-2 


    从上面的输出结果可以看出,thread1和thread2的线程名都已经修改了,而thread3的线程名仍然为默认值:Thread-2.thread3的线程名之所以不是Thread-1,而是Thread-2,这是因为在024行建立thread2时已经将Thread-1占用了,因此,在025行建立thread3时就将thread3的线程名设为Thread-2.然后在026行又将thread2的线程名修改为MyThread2.因此就会得到上面的输出结果。

    注意:在调用start方法前后都可以使用setName设置线程名,但在调用start方法后使用setName修改线程名,会产生不确定性,也就是说可能在run方法执行完后才会执行setName.如果在run方法中要使用线程名,就会出现虽然调用了setName方法,但线程名却未修改的现象。

    Thread类的start方法不能多次调用,如不能调用两次thread1.start()方法。否则会抛出一个IllegalThreadStateException异常。
分享到:
评论

相关推荐

    Java多线程初学者指南

    Java多线程初学者指南是一份详尽的教育资源,涵盖了多线程编程的基本概念和实践技巧,适合初学者深入理解这一重要技术。本指南通过12篇文档,逐步引导学习者掌握Java多线程的核心知识。 首先,让我们从基础开始,...

    Java多线程初学者指南:线程的生命周期.pdf

    在Java编程中,多线程是一项重要的特性,它允许程序同时执行多个任务,提升效率。本文将深入探讨Java多线程中的线程生命周期,以及如何控制线程的状态转换。 线程的生命周期通常包括五个基本状态:新建(New)、...

    Java多线程初学者指南(7):向线程传递数据的三种方法.docx )

    Java 多线程初学者指南之向线程传递数据的三种方法 在多线程编程中,向线程传递数据是一项非常重要的任务。与传统的同步开发模式不同,在多线程异步开发模式下,数据的传递和返回方式有很大的区别。因此,本文将...

    java多线程的讲解和实战

    本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者以及希望深入理解多线程的开发者。 1. **线程的基本概念**:线程是程序执行的最小单位,一个进程中可以有多个线程同时运行。Java...

    java多线程初学者教程

    ### Java多线程初学者教程知识点详解 #### 一、多线程概念解析 - **定义与特性**:多线程是一种程序结构设计方式,它允许多个指令流在同一程序中并发执行。每个指令流被称作一个线程,它们在逻辑上可以“同时”执行...

    Java多线程基础学习指南:原理、实现与实战

    首先解释了线程的概念及其优势,接着讲述了如何通过继承Thread类、实现Runnable接口和使用Callable接口来创建多线程。此外,还介绍了常见的线程控制方法,如start()、sleep()、join()等。随后,讨论了线程同步的方法...

    头歌java多线程基础-Java多线程基础详解与实战指南

    内容概要:本文详细介绍了Java多线程的基础...其他说明:本文通过实际案例和代码示例,深入浅出地讲解了Java多线程的核心知识点,有助于初学者快速入门并进阶。建议在学习过程中亲自编写并调试代码,以加深理解和记忆。

    JAVA多线程模型详解

    本文将深入探讨Java多线程模型的相关知识点,包括线程与进程的区别、线程的实现原理、线程的创建方法以及线程的阻塞与唤醒机制等,旨在为初学者提供一个清晰的多线程概念理解和使用指南。 一、线程与进程的区别 在...

    Java初学者指南

    ### Java初学者指南知识点梳理 #### 一、Java概述与发展历程 - **定义与特性**:Java是一种广泛使用的面向对象的编程语言,以其跨平台性(Write Once, Run Anywhere, WORA)著称。 - **发展历史**: - 由Sun ...

    Java的多线程(java基础)

    理解多线程对于Java开发者至关重要,尤其对初学者来说,是掌握高级编程技巧的基础。 首先,我们需要理解进程和线程的概念。进程是计算机中正在执行的程序,拥有独立的内存空间和系统资源,允许多个程序同时运行。而...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入...无论是初学者还是经验丰富的开发者,都能从中受益匪浅,提升自己的多线程编程能力。

    Java实现多线程下载源代码

    总的来说,这个项目是一个很好的实践示例,它不仅展示了Java多线程编程的基本概念,还结合了图形用户界面的设计,帮助初学者理解和掌握这两个重要的编程技能。通过分析和运行这个源代码,开发者不仅可以学习到多线程...

    java 多线程示例

    本示例旨在为初学者提供一个全面理解Java多线程的起点。通过学习这个实例,你可以掌握如何创建和管理线程,理解线程同步与通信的重要性,以及如何处理线程安全问题。 1. **线程的创建** Java提供了两种创建线程的...

    java多线程简单下载器

    【Java多线程简单下载器】是一个初学者的编程作业,虽然代码可能较为混乱,但其核心功能已经实现,即通过多线程技术进行文件的下载。在Java中,多线程是并发处理的重要手段,它允许多个任务在同一时间执行,从而提高...

    Java多线程的经典资料.rar

    1. **线程创建**:Java提供了多种方式来创建线程,如通过实现`Runnable`接口或继承`Thread`类。实现`Runnable`接口更为灵活,因为Java不支持多继承,而`Thread`类本身已经继承了`Object`类。 2. **线程启动**:创建...

    java 线程初学者资料

    Java 线程初学者资料 Java 中的线程是一个复杂的主题,对初学者来说可能有些难以掌握。然而,理解 Java 线程是非常重要的,因为它可以帮助我们编写高效的程序。 Java 中的线程有两种实现方法,一种是实现 Runnable ...

    详细剖析JAVA多线程案例教学

    本文将详细介绍Java多线程的基础知识、应用场景以及编程实践,旨在帮助初学者快速掌握多线程编程的核心概念和技术要点。 #### 二、Java多线程基础 ##### 1. 线程的概念 线程是程序执行流的最小单元,是操作系统能够...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者逐步掌握这一关键技能。 1. **线程简介** - 线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程,它们...

    java多线程学习

    对于初学者而言,要通过理论学习与代码实践相结合的方式,逐步掌握多线程编程的核心概念和实际操作技巧,从而在实际应用中灵活运用。在学习的过程中,还可以参考多种教学资源,比如课本、在线教程、开源项目代码等,...

Global site tag (gtag.js) - Google Analytics