内容提要:
八个构造方法
线程名的指定:构造方法、setName
线程不能重复调用,否则抛异常(IllegalThreadStateException异常)
在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接口的类的实例。
1.Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。
2.直接实现Runnable接口类的实例。
3.线程池建立多线程(稍微复杂,学到待续)
String name
线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。默认线程名:Thread-N,N是线程建立的顺序,是一个不重复的正整数。
ThreadGroup group
当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。
long stackSize
线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB.在x86平台下,默认的线程栈大小是12KB.
简单的例子
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 }
上面代码的运行结果如下(任何一个Java程序都必须有一个主线程。一般这个主线程的名子为main.只有在程序中建立另外的线程,才能算是真正的多线程程序。):
main
Thread-0
Thread-1
Thread类有一个重载构造方法可以设置线程名。除了使用构造方法在建立线程时设置线程名,还可以使用Thread类的setName方法修改线程名。
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 }
thread1:MyThread1
thread2:MyThread2
thread3:Thread-2
注意:在调用start方法前后都可以使用setName设置线程名,但在调用start方法后使用setName修改线程名,会产生不确定性,也就是说可能在run方法执行完后才会执行setName.如果在run方法中要使用线程名,就会出现虽然调用了setName方法,但线程名却未修改的现象。
Thread类的start方法不能多次调用,如不能调用两次thread1.start()方法。否则会抛出一个IllegalThreadStateException异常。
分享到:
相关推荐
Thread类是.NET Framework中的System.Threading命名空间下的一个核心组件,它提供了创建和控制线程的方法。以下是一些关于使用Thread类创建多线程的关键知识点: 1. **创建线程对象**: 首先,我们需要创建Thread...
总之,通过创建`Thread`对象并调用`start()`方法,我们可以启动一个新的线程来执行特定的任务。在实际开发中,应考虑线程安全、资源管理和性能优化,以确保程序的稳定性和高效性。对于`Ex_20_1`这个示例文件,它可能...
在创建线程时,可以使用`Thread`类的不同构造方法。这些构造方法允许你传递参数,如线程名、线程组和栈大小。例如,你可以通过`Thread(Runnable target, String name)`构造方法为线程提供一个名字,使得在调试和日志...
因此,要启动一个实现了`Runnable`接口的线程,必须将该对象传递给`Thread`类的构造函数,并调用`Thread`实例的`start()`方法。 在示例代码中,`MyThread`也可以选择实现`Runnable`接口而不是继承`Thread`类。这时...
另一种方式是创建一个实现`Runnable`接口的类,然后在`Thread`构造函数中传入这个实现类的实例。这也需要重写`run()`方法。示例如下: ```java public class MyRunnable implements Runnable { public void run() ...
在`main()`方法中,我们实例化了一个`Demo`对象`d`,然后使用`Thread`类的构造方法`Thread(Runnable target)`创建了两个线程对象`t1`和`t2`,并将`d`作为参数传入。这样,`t1`和`t2`都将执行`Demo`类中的`run()`方法...
- **实现Runnable接口**:创建一个实现了Runnable接口的类,然后将其实例传递给Thread的构造器,同样可以启动新线程。这种方式更灵活,因为Java不支持多重继承,但可以与其他接口一起使用。 - **实现Callable接口...
`moveToThread`函数是QT多线程编程中的一个重要方法,它允许我们将一个对象移动到指定的QThread对象中,从而使该对象的工作在新的线程上下文中执行。 首先,理解多线程的基本概念至关重要。在计算机科学中,线程是...
然而,继承Thread类的方式有一个缺点,即Java不支持多重继承,这意味着如果一个类已经继承了另一个类,就不能再继承Thread类,这限制了类的继承结构。 接下来是实现Runnable接口的方式。通过实现Runnable接口来创建...
这里我们将深入探讨标题所提及的“继承Thread类构造多线程实例”的方法。 1. **线程基础**: - **线程**是程序中的执行单元,每个线程都有自己的程序计数器、系统栈、局部变量等资源,它们共享同一块内存区域,即...
- `Thread()`:无参构造方法,创建一个空的线程对象。 - `Thread(Runnable target)`:接受一个实现了`Runnable`接口的对象作为参数,用于指定线程任务。 - `Thread(String name)`:创建一个指定名字的线程对象。 ...
创建一个新线程的基本步骤包括声明一个`std::thread`对象,然后通过传递一个函数或成员函数以及其参数来启动线程。下面是一个简单的例子: ```cpp #include #include <thread> void print_message(const std::...
创建一个不带参数的线程函数,我们可以使用`Thread`类的构造函数,如下所示: ```csharp using System.Threading; public class MultiThreadExample { public void RunWithoutParameter() { // 创建一个新的...
通过实例化`Thread`类并传递一个委托(代表要在线程上执行的方法)作为构造函数的参数,即可创建新线程。例如: ```csharp Thread newThread = new Thread(new ThreadStart(MyThreadMethod)); ``` 其中`...
在Java编程语言中,创建线程主要有两种方式:使用`Thread`类以及实现`Runnable`接口。本篇文章将深入探讨如何使用`Thread`类来创建和管理线程。 首先,让我们了解一下`Thread`类的基本构造方法。`Thread`类提供了多...
在创建Thread类的子类时,如果子类没有提供构造器,会默认调用Thread的无参构造器。 - `Thread(String name)`:创建一个具有指定名称的新线程对象,便于识别和调试。 - `Thread(Runnable target)`:创建一个新...
2. 实现Runnable接口:创建一个实现`java.lang.Runnable`接口的类,然后将其实例传递给Thread类的构造函数。同样通过`start()`方法启动线程。 ```java class MyRunnable implements Runnable { public void run() ...
2. **实例化Thread对象**:创建一个`Thread`对象,并将线程方法作为参数传递给构造函数。 ```csharp Thread myThread = new Thread(new ThreadStart(MyThreadMethod)); ``` 这里,`ThreadStart`委托被用来指定线程...
在上述示例中,我们定义了一个简单的线程函数`threadFunction`,并通过`std::thread`构造函数创建了一个线程。调用`t.join()`确保主线程等待新创建的线程执行完毕后才继续执行。 ### 二、线程的终止 #### 2.1 使用...
在给定的代码片段中,虽然存在一些乱码字符,但我们可以从中抽取出与多线程相关的知识点,包括如何创建线程、使用委托进行跨线程调用以及如何优雅地关闭线程。 ### 创建线程 在C#中,`System.Threading.Thread`类...