两种生成线程的方式

线程是一种可以充分利用cpu资源的技术,在我们日常开发中经常使用,要创建一个线程有两种方式,下面我们来看看,这两种创建方法。

第一种:继承Thread

public class Theardtest extends Thread {
	
	public void run() {
		System.out.println("hello");
		
	}
	
	public static void main(String[] args) {
		//启动线程的两种方式
		Thread thread=new Theardtest();
		thread.setName("我是线程1");
		thread.start();
	
	}

}

Thread thread=new Theardtest();将类对象传给线程对象。

第二种:继承runnable接口

class Theardtest2 implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		System.out.println("hello,我是线程2");
		
	}
	
	public static void main(String[] args) {
		//启动线程的两种方式
		Thread thread2=new Thread(new Theardtest2());
		thread.setName("我是线程1");
		thread2.start();
	}
	
	
	
}

Thread thread2=new Thread(new Theardtest2());将继承runnable接口的类的对象传入。

 

<think>好的,我需要回答用户关于多线程编程中两种常见创建线程方式的问题。首先,我得回忆一下Java多线程的基础知识。根据用户提供的引用,特别是引用[1]和[2],里面提到了通过继承Thread类和实现Runnable接口这两种方式。 用户提到的引用[1]详细说明了通过继承Thread类来创建线程,并且提到了start()方法的重要性,而不是直接调用run()方法。引用[2]中也提到了继承Thread类和基于Runnable接口的实现,同时指出Thread与Runnable的关系。这些信息是关键,需要整合到回答中。 接下来,我需要确定两种方式的具体步骤和区别。第一种方式是继承Thread类,重写run()方法,然后创建实例并调用start()方法启动线程。第二种方式是实现Runnable接口,同样实现run()方法,然后将Runnable实例传递给Thread的构造函数,再调用start()方法。这两种方式的不同之处在于,由于Java不支持多重继承,实现Runnable接口的方式更灵活,允许类继承其他类。 另外,用户提供的引用[3]和[4]可能涉及其他内容,比如Callable或者QThread,但用户的问题集中在两种常见方式,所以可能需要专注于前两种。不过引用[4]提到的是另一种方式,比如使用moveToThread,这可能属于特定框架(如Qt)的实现,不在标准Java范围内,所以可能不需要在此提及。 需要确保回答结构清晰,分点说明两种方式,并对比它们的优缺点。同时,根据用户提供的示例,可能需要给出代码示例,但用户的问题中并没有明确要求代码,不过根据示例中的情况,可能还是需要提供简单的代码片段来说明两种方式。 另外,要记得在回答末尾生成相关问题,并正确添加引用标识。引用[1]、[2]是关于继承Thread和Runnable的,需要正确标注。 最后,要检查是否符合系统级指令,比如使用正确的中文,数学表达式格式正确,引用标识的位置自然等。由于问题中没有涉及数学公式,这部分可能不需要处理,但需要确保格式正确。</think>### 多线程两种常见创建方式 在Java多线程编程中,创建线程两种主要方式是通过**继承`Thread`类**和**实现`Runnable`接口**。以下是具体说明和对比: --- #### 1. 继承`Thread`类 **步骤**: 1. 定义一个类并继承`Thread`类。 2. 重写`run()`方法,编写线程需要执行的任务逻辑。 3. 创建该类的实例,并调用`start()`方法启动线程。 **代码示例**: ```java class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("线程执行: " + i); try { Thread.sleep(100); // 模拟耗时操作 } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); // 启动线程,JVM会自动调用run() } } ``` **特点**: - 简单直观,适合快速实现。 - 缺点是Java不支持多重继承,若类已继承其他类,则无法使用此方式[^2]。 --- #### 2. 实现`Runnable`接口 **步骤**: 1. 定义一个类并实现`Runnable`接口。 2. 实现`run()`方法,编写任务逻辑。 3. 创建`Runnable`实例,将其作为参数传递给`Thread`类构造函数。 4. 调用`Thread`实例的`start()`方法启动线程。 **代码示例**: ```java class MyRunnable implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("Runnable线程执行: " + i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); } } ``` **特点**: - 灵活性高,类可以继承其他类或实现多个接口。 - 适合资源共享的场景(如多个线程操作同一任务对象)[^1][^2]。 --- #### 对比与选择 | **方式** | **优点** | **缺点** | |-------------------|-----------------------------|------------------------------| | 继承`Thread`类 | 实现简单 | 受限于单继承机制 | | 实现`Runnable`接口| 灵活性高,支持资源共享 | 需额外创建`Thread`对象 | --- **关键点**: - 必须通过`start()`方法启动线程,而非直接调用`run()`。`start()`会触发JVM创建新线程并调用`run()`,而直接调用`run()`会视为普通方法在当前线程执行[^2]。 - 使用`Thread.sleep()`可控制线程执行节奏,避免单一线程长时间占用CPU[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值