开启多线程的方法

要开启一个多线程有两种方法:

1、继承 Thread 类

通过继承 Thread 类的方式实现多线程有4个步骤:

<1>create 一个类,让它继承 Thread 类

<2>重写 Thread 类里面的 run 方法,把需要执行的代码块放在 run 方法体内

<3>在主线程(主程序)内创建该类的对象

<4>用该对象调用 start 方法

例子:

package multiThread;

public class jichengThread {
	
	public static void main(String[]args){
		myThread mt = new myThread();
		mt.start();
		for(int i=0;i<1000;i++)
			System.out.println("主线程程序在执行.......");
	}
	
}

class myThread extends Thread{
	public void run(){
		for(int i=0;i<1000;i++)
			System.out.println("子线程程序在执行.......");
	}
}

执行结果:可以看到两个线程在同时执行


但是有时候即使开启了一个多线程(开启多线程就是CPU在执行主程序的时候,同时分配一些空间执行子程序),但是还是看不到两个线程在同时执行,那有可能是主线程的程序执行时间太短,没有看到交替执行的结果,比如在 for 循环里面把循环的次数减小到10,就看不到交替执行的结果,但其实还是多线程

除了创建两个类之外,还可以用匿名内部类的方式继承 Thread 类,重写 Thread 里面的run 方法,调用 start() 方法,实现多线程,如下:

(匿名内部类就是创建一个类的对象,并不给其赋给对应的引用,如下面的 new Thread() 创建了一个 Thread 的对象,米有给其赋给一个引用,而 new Thread 后面跟小括号、大括号,表示该类继承Thread类,并创建了一个Thread类的子类对象,里面的 run 方法表示重写该方法,最终相当于创建了一个 Thread 类的对象,再调用 start 方法执行线程)

package multiThread;

public class nimingneibuleishixian {

	public static void main(String[] args) {
		new Thread(){
			@Override
			public void run() {
				for(int i=0;i<1000;i++)
					System.out.println("子线程在执行....");
			}
		}.start();
		
		for(int i=0;i<1000;i++){
			System.out.println("主线程在执行....");
		}
	}
}
运行结果:


2、实现 Runable 接口

通过该方法实现多线程的步骤如下:

<1>创建一个类,实现Runnable 接口

<2>重写 run 方法(注意:run 方法是 Runnable 接口里面唯一的方法,Thread 类也是实现了 Runnable 接口)

<3>创建该类的一个对象

<4>调用 Thread 类的有参构造,把上一步创建的对象作为参数传递,创建 Thread 类的一个对象

<5>调用该对象的 start 方法

例子:

package multiThread;

public class shixianRunable {

	public static void main(String[] args) {
		
		myRunable mr = new myRunable();
		Thread t = new Thread(mr);
		t.start();
		for(int i=0;i<1000;i++)
			System.out.println("主线程程序在执行....");
	}
}

class myRunable implements Runnable{
	
	public void run(){
		for(int i=0;i<1000;i++)
			System.out.println("子线程程序在执行.....");
	}
}

同样也可以使用匿名内部类实现 Runnable 接口的方式实现多线程:

package multiThread;

public class nimingneibuleishixian {

	public static void main(String[] args) {
	
		//创建一个 Thread 的子类对象
		new Thread(  //把这里面的东西作为 Thread 的构造参数传入进去
			new Runnable(){
				@Override
				public void run() {
				for(int i=0;i<1000;i++)
					System.out.println("子线程在执行....");
				}
			}
		).start();
		for(int i=0;i<1000;i++){
			System.out.println("主线程在执行....");
		}
		
		
	}
}

由于用 new Runnable() 的方式是创建的 Runnable 的子类对象,但是 Runnable 的子类对象里面没有 start 方法,该方法只在 Thread 里面有,所以要把其作为一个参数传递给 Thread 的构造函数,再调用 start 开启线程


**对实现 Runnable 方式创建线程的一点理解:

编译的时候,调用的是 Runnable 接口里面的方法,在实际运行的时候,调用的是 myRunnable 里面的方法

在实际应用中,由于java 不支持多继承,所以当一个类没有继承一个父类的时候,应该优先考虑使用继承 Thread 类的方式,因为这种方式简单,如果继承了其他的父类,就要用实现 Runnable 接口的方式了

<think>首先,用户的问题是:“我想查找在Linux系统中开启多线程方法 请问Linux系统开启多线程方法”。这涉及到Linux系统中如何创建和使用多线程。 从用户的引用中,我有一些参考资料: - 引用[1]讨论了Linux的线原理,提到Linux使用进来模拟线。 - 引用[2]提到了Linux下多线程的函数,如以"pthread_"头的函数,需要包含头文件<pthread.h>,并在链接时使用-lpthread选项。 - 引用[3]展示了在C++中使用CMakeLists.txt来链接线库的例子。 用户的上一次问题和我的回答在上下文中没有提供,因为这是新对话的始。用户说“参考站内引用”,但这不是用户的需求;用户真正的问题是开启多线程方法。 我的响应需要: - 使用中文回答。 - 确保行内数学表达式用$...$格式,独立公式用$$...$$格式。但在这个主题中,可能没有数学表达式,所以我可以忽略这个,除非有数学相关内容。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识。 - 结构清晰,帮助用户逐步解决问题。 主题是Linux开启多线程方法。这通常是编相关的,涉及到POSIX线(pthread)。 关键点: - 在Linux中,多线程是通过POSIX线库(pthread)实现的。 - 需要包含头文件pthread.h。 - 链接时需要添加-lpthread选项。 - 使用函数如pthread_create来创建线。 步骤: 1. **理解线创建的核心函数**:pthread_create函数用于创建新线。 2. **编写代码**:在C或C++中编写线函数。 3. **编译和链接**:编译时链接pthread库。 从引用[2]和[3]直接提取信息: - 引用[2]说:函数以"pthread_"打头,包含<pthread.h>,链接时用-lpthread。 - 引用[3]给出CMake的例子:target_link_libraries(unique_mutex pthread)。 我将构建一个清晰的回答结构: - **介绍**:简要解释Linux多线程的原理(参考引用[1])。 - **详细步骤**: - 包含头文件。 - 定义线函数。 - 使用pthread_create创建线。 - 编译命令。 - 可选:在C++中使用CMake的例子。 - **结束**:总结。 添加引用标识: - 在解释原理时引用[1]。 - 在描述函数和编译时引用[2]。 - 在给出CMake例子时引用[3]。 生成相关问题:在回答结束时,添加相关问题部分。 最终响应结构: 1. 引言:Linux线原理。 2. 开启多线程的具体方法。 3. 代码示例。 4. 编译说明。 5. 相关问题。 代码示例:提供一个简单的C序,展示如何创建线。 确保回答真实可靠:基于标准知识。 </think>### Linux系统中开启多线程方法 在Linux系统中,开启多线程主要通过POSIX线库(pthread)实现,这是一种标准的线管理机制。Linux实际上采用轻量级进(LWP)来模拟线,从而高效管理线的创建、终止和调度,这得益于内核级的线支持[^1]。下面我将详细介绍开启多线程的具体步骤,包括编方法和编译要求。整个过清晰可靠,基于标准POSIX规范。 #### 1. **编基础:使用pthread库** - **包含头文件**:在C或C++代码中,必须包含`<pthread.h>`头文件,以访问线相关函数。这些函数通常以"pthread_"头,如`pthread_create`用于创建线。 - **定义线函数**:线函数需返回`void*`类型,并接受一个`void*`参数。这是一个线入口点的标准格式。 - **创建线**:使用`pthread_create`函数启动新线。该函数需要传递线标识符、线属性(通常设为NULL)、线函数地址和参数。 - **等待线结束**:推荐使用`pthread_join`等待线完成,以避免资源泄漏。 以下是简单的C代码示例,展示如何创建一个线: ```c #include <stdio.h> #include <pthread.h> // 线函数定义:打印消息 void* thread_function(void* arg) { printf("新线启动: 参数 = %d\n", *(int*)arg); return NULL; // 线结束 } int main() { pthread_t thread_id; // 线标识符 int parameter = 42; // 传递给线的参数 // 创建线 int result = pthread_create(&thread_id, NULL, thread_function, &parameter); if (result != 0) { perror("线创建失败"); return 1; } printf("主线运行中...\n"); pthread_join(thread_id, NULL); // 等待线结束 printf("主线结束\n"); return 0; } ``` #### 2. **编译和链接要求** - **编译命令**:在编译时,必须添加`-pthread`选项(或`-lpthread`用于链接)。这会确保链接到POSIX线库。 - 例如,使用GCC编译器:`gcc -o my_thread_program my_thread_program.c -pthread` - **在C++中使用**:C++代码同样适用上述方法。如果使用CMake构建工具,可以在`CMakeLists.txt`中添加链接选项,如: ```cmake target_link_libraries(你的可执行文件名 pthread) ``` 这确保线库被正确链接[^3]。 #### 3. **注意事项与最佳实践** - **线安全**:多线程需避免竞争条件。使用互斥锁(如`pthread_mutex_t`)保护共享资源。 - **性能考虑**:Linux的多线程实现高效,但过的线可能导致调度销。建议使用线池管理线生命周期[^1]。 - **错误处理**:检查`pthread_create`的返回值,非零值表示失败(如权限不足或资源限制)。 - **环境兼容性**:这个方法在大数Linux发行版(如Ubuntu、CentOS)上通用,依赖于glibc库。 开启多线程的核心是理解Linux利用进结构模拟线的机制,这使得线管理轻量且高效[^1]。通过上述代码和编译步骤,您可以轻松实现多线程序。如果您需要更优化或扩展示例,请提供具体场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micrle_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值