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

publicThread(Runnable target);

publicThread(String name);

publicThread(Runnable target, String name);

publicThread(ThreadGroup group, Runnable target);

publicThread(ThreadGroup group, String name);

publicThread(ThreadGroup group, Runnable target, String name);

publicThread(ThreadGroup group, Runnable target, String name,longstackSize);

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类建立线程的例子:packagemythread;

publicclassThread1extendsThread

{

publicvoidrun()

{

System.out.println(this.getName());

}

publicstaticvoidmain(String[] args)

{

System.out.println(Thread.currentThread().getName());

Thread1 thread1 =newThread1();

Thread1 thread2 =newThread1 ();

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的子类中也添加一个用于传入线程名的构造方法。下面的代码给出了一个设置线程名的例子:packagemythread;

publicclassThread2extendsThread

{

privateString who;

publicvoidrun()

{

System.out.println(who +":"+this.getName());

}

publicThread2(String who)

{

super();

this.who = who;

}

publicThread2(String who, String name)

{

super(name);

this.who = who;

}

publicstaticvoidmain(String[] args)

{

Thread2 thread1 =newThread2 ("thread1","MyThread1");

Thread2 thread2 =newThread2 ("thread2");

Thread2 thread3 =newThread2 ("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-1

从上面的输出结果可以看出,thread1和thread2的线程名都已经修改了,而thread3的线程名仍然为默认值:Thread-1。thread3的线程名之所以不是Thread-2,而是Thread-1,这是因为在026行已经指定了thread2的Name,因此,启动thread3时就将thread3的线程名设为Thread-1。因此就会得到上面的输出结果。

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

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

【编辑推荐】

【责任编辑:杨赛 TEL:(010)68476606】

点赞 0

java 创建线程thread_初学Java多线程:用Thread类创建线程相关推荐

  1. PYTHON——多线程:Thread类与线程函数

    Thread类与线程函数 可以使用Thread对象的join方法等待线程执行完毕:主线程(main()函数)中调用Thread对象的join方法,并且Thread对象的线程函数没有执行完毕,主线程会处 ...

  2. C++多线程:thread类创建线程的多种方式

    文章目录 描述 函数成员简介 总结 描述 头文件 <thread> 声明方式:std::thread <obj> 简介 线程在构造关联的线程对象时立即开始执行,从提供给作为构造 ...

  3. Java继承Thread类创建多线程

    Java继承Thread类创建多线程 单线程示例 示例,Example01.java public class Example01{public static void main(String[] a ...

  4. thread类 java_java入门避坑必读,通过Thread类创建java多线程

    欲善编程,多看.敲.讨论:动眼.手.大脑. 1 为什么要用多线程 平常我们做crud的时候,用到多线程的机会不多.但当我们要处理一些复杂的业务时,或者提高程序处理效率时,就绕不开多线程的使用.也有些时 ...

  5. 多线程—Thread类及线程三种创建方式及对比

    线程创建的3种方法: 1.继承Thread类并重写run方法 Thread类方法: Thread Thread.currentThread() :获得当前线程的引用.获得当前线程后对其进行操作. Th ...

  6. 学java用什么写比较好_学习Java需要什么基础,初学Java如何写好代码

    原标题:学习Java需要什么基础,初学Java如何写好代码 初学Java的同学时常会遇到这样的情况,跟着入门教程看过一遍,但需要自己写代码的时候却无从下手:写代码的时候时常会遇到不懂的地方,如果停下来 ...

  7. Thread类创建线程

    目录 1.在java中执行多线程编辑 1.1通过Thread类创建线程 1.2创建线程方法2 1.3创建线程方法3 1.4创建线程方法4 1.5创建线程方法5 2.多线程执行效率 2.1两个变量同时自 ...

  8. 多线程Thread类创建多线程

    package com.ajax; //多线程Thread类创建多线程 public class Example02 {public static void main(String[] args){n ...

  9. 多线程介绍与threading模块应用以及使用Thread类创建多线程

    1.多线程: 多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率.线程是在同一时间需要完成多项任务的时候实现的. 最简单的比喻多线程就像火车的每一节车厢,而进 ...

最新文章

  1. vscode中使用js的console配置 - mac
  2. BCH或许才是真正的未来
  3. TensorFlow 完整的TensorFlow入门教程
  4. base target=_self/IE6、IE7 用法(转)
  5. 基于Delphi的接口编程入门
  6. Python学习笔记011_模块_标准库_第三方库的安装
  7. 缺省的servlet(了解)
  8. python中curve fit_在python中拟合多变量curve_fit
  9. virsh 网络设置_KVM使用Network Filters进行虚拟机网络管理 | leon的博客
  10. 使用Rancher搭建K8S测试环境
  11. 如何画一张架构图(内含知识图谱)
  12. python 二维数组长度_剑指offer二维数组中的查找【Java+Python】
  13. Tomcat端口冲突
  14. Spring Boot基础学习笔记19:自定义RedisTemplate与RedisCacheManager
  15. 腾讯接入华为鸿蒙!QQ音乐与Harmony OS达成合作 推出听歌识曲万能卡片
  16. Java运行报错问题——Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook
  17. 关于TI杯全国大学生电子设计竞赛
  18. VMware Workstation16安装
  19. js 跨域获取cookie
  20. JDK 中需要掌握的常用类库

热门文章

  1. 百度小程序开发的基础
  2. 愿2014年02月14日,所有情人情人节快乐!
  3. DB9和DB25的常用信号脚说明;RS232接口针脚定义
  4. Android 游戏闯关
  5. 一个模型击溃 12 种 AI 造假,各种 GAN 与 Deepfake 都阵亡!
  6. 程序员,10年的开发经验,在35岁的生理年龄面前,一文不值
  7. squid 中文权威指南--第5章 Squid运行
  8. windows7 安装SSH (亲测有效)
  9. 二、openCV+TensorFlow入门
  10. java actioncontext_struts2(四) ognl表达式、值栈、actionContext之间的关系