在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类建立线程的例子:
001 package mythread;
002
003 public class Thread1 extends Thread
004 {
005 public void run()
006 {
007 System.out.println(this.getName());
008 }
009 public static void main(String[] args)
010 {
011 System.out.println(Thread.currentThread().getName());
012 Thread1 thread1 = new Thread1();
013 Thread1 thread2 = new Thread1 ();
014 thread1.start();
015 thread2.start();
016 }
017 }
上面的代码建立了两个线程: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的子类中也添加一个用于传入线程名的构造方法。下面的代码给出了一个设置线程名的例子:
001 package mythread;
002
003 public class Thread2 extends Thread
004 {
005 private String who;
006
007 public void run()
008 {
009 System.out.println(who + ":" + this.getName());
010 }
011 public Thread2(String who)
012 {
013 super();
014 this.who = who;
015 }
016 public Thread2(String who, String name)
017 {
018 super(name);
019 this.who = who;
020 }
021 public static void main(String[] args)
022 {
023 Thread2 thread1 = new Thread2 ("thread1", "MyThread1");
024 Thread2 thread2 = new Thread2 ("thread2");
025 Thread2 thread3 = new Thread2 ("thread3");
026 thread2.setName("MyThread2");
027 thread1.start();
028 thread2.start();
029 thread3.start();
030 }
031
在类中有两个构造方法:
第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异常。
分享到:
相关推荐
提供一套在VC++开发中需要使用到的创建线程和终止线程方法。
启动两个线程,一个线程打印1~52,另一个线程打印A~Z
- 首先,创建一个新的单元,然后声明一个新的类,如`TMyThread`,继承自`TThread`。 - 在这个新类中,定义任何需要的数据成员,以存储线程所需的特定信息。 - 重写`Execute`方法,这是线程将执行的代码。在这个...
Thread类是C#中另一种创建线程的方式,使用Thread类可以创建一个独立的线程,该线程有它独立的执行路径,能够与其它的线程同时地运行。 使用Thread类创建线程需要手动地创建和管理线程,这需要开发者有充分的线程...
在Windows操作系统中,创建线程通常通过API函数`CreateThread`来实现。这个函数位于`Windows.h`头文件中,其基本语法如下: ```cpp HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全...
在C++环境中,我们通常会使用WinAPI函数`_beginthreadex`来创建线程,它是一个跨平台的线程创建方法,属于C运行时库(CRT)的一部分。本文将详细探讨如何使用`_beginthreadex`创建多线程以及其相关的知识点。 首先,...
多线程编程是指在一个进程中同时运行多个线程,以提高程序的执行效率和响应速度。在 VS2013 平台中,创建多线程可以使用 CreateThread 函数或 AfxBeginThread 函数。 1. 创建线程结构体 首先,需要定义一个线程...
本项目“C# Winform动态创建和关闭多线程源码 可运行”提供了一个完整的解决方案,适用于Visual Studio 2010,它演示了如何在Winform应用中灵活地创建和管理多个线程。 一、线程基础 线程是操作系统分配CPU时间的...
创建线程时,我们需要提供一个线程函数,这个函数将在新线程中运行。在这个例子中,线程函数可能会用于创建和显示窗口。线程函数通常会遵循这样的步骤: 1. 初始化窗口类(WNDCLASS):设置窗口类的风格、背景刷、...
2. **创建线程**:在Windows API中,`CreateThread`函数用于创建新的线程。它需要提供线程函数的地址,线程函数会执行特定的任务,比如获取并显示时间。此外,还需要传递一些参数,如线程的初始栈大小和优先级。 3....
本文将深入探讨如何在C#环境中创建线程,通过一个简单的实例来帮助你理解线程的应用和实现。 C#中的线程主要通过`System.Threading`命名空间中的`Thread`类来创建和管理。首先,我们需要包含这个命名空间,以便可以...
例如: for (int i = 0; i ; i++) { ...如何关闭其中的一个线程呢? 请下载解决方案。 呵呵,这个实例10分值的买, 觉得好的话就评个分吧,评分后会返回你11分 (一定要评分,光评论是不返分的)
Java提供了多种创建线程的方式,其中最常见的是通过继承`Thread`类和实现`Runnable`接口这两种方法。下面将详细阐述这两种创建线程的方法及其区别。 ### 一、通过继承`Thread`类创建线程 当一个类继承了`Thread`类...
程序创建两个线程,第一个线程没有消息队列,主线程尝试给第一个线程发送一个消息,我们可以看到PostThreadMessage()返回FALSE,程序创建的第二个线程有一个消息队列,主线程中的PostThreadMessage()返回TRUE,程序...
在这个"多线程实例,可创建任意多线程"的示例中,我们将深入探讨如何在编程环境中实现多线程,并通过一个类比卖火车票的流程来理解其工作原理。 首先,我们要明白什么是线程。线程是程序执行的最小单元,每个线程都...
创建一个进程时,Windows 会做大量的工作,包括创建一个新的地址空间,为进程分配资源以及创建一个基线程。CreateProcess 函数是创建进程的核心函数,其原型如下: CreateProcess( LPCTSTR lpApplicationName, // ...
创建一个带三个子线程的程序,第一个线程启动10ms后,第二个线程再启动,然后再等待10ms后第三个线程启动,每一个线程从1—1000循环输出线程的名称和计数,当三个线程结束时要输出各自的结束信息,然后主线程结束。
在C++中,我们可以使用`std::thread`库来创建线程。例如,主线程创建一个新线程,这个新线程又可以创建更多的子线程。下面是一个简单的示例: ```cpp #include #include // 子线程函数 void childThreadFunction...
然而,继承Thread类的方式有一个缺点,即Java不支持多重继承,这意味着如果一个类已经继承了另一个类,就不能再继承Thread类,这限制了类的继承结构。 接下来是实现Runnable接口的方式。通过实现Runnable接口来创建...
在计算机科学中,多线程是指一个进程中包含多个线程的并发执行。每个线程都是进程的一个执行路径。通过多线程技术,可以在同一进程内实现任务的并行处理,提高程序的运行效率和响应速度。 ##### 2.2 MFC多线程实现 ...