thread_create(线程基本常识)

本文详细介绍了Java中创建线程的四种常见方法:直接使用Thread类、继承Thread类并重写run方法、实现Runnable接口并通过Thread类启动、以及同时实现Runnable和Thread的run方法。每种方式都有其特点及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.gzhs.zsd.thread;






/***
 * 了解线程创建方式
 * 线程Thread实现Runnable接口
 * @author 谢泽鹏
 * @version 1.0
 */
public class Traditional_Thread {





public static void main(String[] args) {

//方式一
//线程类Thread创建, 启动时调用父类的run()方法.
Thread thread_01 = new Thread();
thread_01.start();
System.out.println("thread_01 线程编号: " + thread_01.getName() + " #### " + "thread_01 线程名称: " + thread_01.getId());


//方式二
//线程类Thread创建, 启动时重写父类的run()方法. 调用时super.run();表示先调用父类run()方法
Thread thread_02 = new Thread(){
@Override
public void run() {
while (true) {
try {
//线程睡眠5秒
Thread.sleep(5000);
//这里this指的是当前线程对象,即 thread_02, 所以这里可以采用this.getName()和this.getId()获取线程名称。
System.out.println("thread_02 线程编号:  " + this.getName() + " #### " + "thread_02 线程名称: " + this.getId());
System.out.println("thread_02 线程编号:  " + Thread.currentThread().getName() + " #### " + "thread_02 线程名称: " + Thread.currentThread().getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
thread_02.start();


//方式三
//线程类Thread创建, 启动时重写Runnable的run()方法
Thread thread_03 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
//线程睡眠5秒
Thread.sleep(5000);
//这里this指的是当前Runnable的对象,所以这里无法调用this.getName()和this.getId()获取线程名称。
//System.out.println("thread_02 线程编号:  " + this.getName() + " #### " + "thread_02 线程名称: " + this.getId());
System.out.println("thread_02 线程编号:  " + Thread.currentThread().getName() + " #### " + "thread_02 线程名称: " + Thread.currentThread().getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
});
thread_03.start();



//方式四
//线程类Thread创建, 如创建线程时即实现写Thread的run(), 又实现Runnable的run()方法时。
//Thread的run会执行, 覆盖Runnable的run()方法, 其中Runnable的run()方法不会执行. 形式未new Thread(new runnable){run}
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
//线程睡眠5秒
Thread.sleep(5000);
System.out.println("执行Runnable里面run方法 线程编号:  " + Thread.currentThread().getName() + " #### " + " 线程名称: " + Thread.currentThread().getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}){
public void run() {
while (true) {
try {
//线程睡眠5秒
Thread.sleep(5000);
System.out.println("执行Thread里面run方法  线程编号:  " + Thread.currentThread().getName() + " #### " + " 线程名称: " + Thread.currentThread().getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
}

};
}.start();

}






}

<think>嗯,用户想知道如何在pthread_create中使用线程属性,具体是关于pthread_attr_t的设置。首先,我需要回忆一下pthread库的相关函数。根据提供的引用,用户提到了初始化属性对象、设置栈大小和分离状态等步骤。 首先,线程属性对象pthread_attr_t的创建和初始化是必须的。记得要先用pthread_attr_init来初始化,之后才能设置各种属性。比如设置分离状态,这可以避免线程结束后需要调用pthread_join,这在引用1和2中有示例。 然后,用户可能想知道有哪些属性可以设置。除了分离状态和栈大小,还有调度策略、继承属性、竞争范围等等。不过常见的是分离和栈大小。需要解释每个属性的作用和设置方法,如pthread_attr_setdetachstate和pthread_attr_setstacksize。 接下来,线程创建完成后需要销毁属性对象,避免资源泄漏。这点在引用1里提到过,用pthread_attr_destroy。此外,使用分离属性时,线程结束后会自动回收资源,所以主线程不需要join,这也需要说明。 可能还需要注意错误处理,比如检查每个函数的返回值,但用户的问题可能更关注基本用法,所以可以暂时不深入错误处理。另外,代码示例会帮助用户理解步骤,引用2中的代码展示了如何设置分离属性,可以作为参考。 用户的应用场景可能涉及需要控制线程资源或行为的情况,比如需要大量线程时调整栈大小,或者希望线程自动回收。需要指出这些实际应用场景,帮助用户理解何时使用这些属性设置。 最后,确保回答结构清晰,分步骤说明,并给出示例代码。同时,根据用户的问题,生成相关的问题列表,比如如何设置其他属性,或者不同属性的应用场景,这样可以帮助用户进一步学习。</think>### 线程属性设置详解 在POSIX线程库中,通过`pthread_attr_t`结构体可以设置线程属性,从而控制线程行为。以下是具体使用步骤: --- #### 一、基础操作流程 1. **创建属性对象** 定义`pthread_attr_t`类型变量: ```c pthread_attr_t attr; ``` 2. **初始化属性对象** 必须调用初始化函数: ```c pthread_attr_init(&attr); ``` 3. **设置具体属性** - **设置分离状态**(避免手动调用`pthread_join`): ```c pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); // 分离状态 ``` - **设置栈大小**(默认栈大小通常为8MB): ```c size_t stack_size = 1024 * 1024; // 1MB pthread_attr_setstacksize(&attr, stack_size); ``` 4. **创建线程** 使用属性对象创建线程: ```c pthread_t tid; pthread_create(&tid, &attr, thread_func, NULL); ``` 5. **销毁属性对象** 属性对象使用后必须销毁: ```c pthread_attr_destroy(&attr); ``` --- #### 二、关键属性说明 1. **分离属性** - 分离线程(`PTHREAD_CREATE_DETACHED`)会自动释放资源[^2] - 默认属性为`PTHREAD_CREATE_JOINABLE`,需显式调用`pthread_join` 2. **栈大小调整** 当线程需要处理较大局部变量时,可手动设置栈空间: ```c pthread_attr_setguardsize(&attr, 4096); // 额外设置保护页大小 ``` 3. **调度策略** 可设置线程优先级和调度策略(需管理员权限): ```c struct sched_param param; param.sched_priority = 50; pthread_attr_setschedpolicy(&attr, SCHED_RR); pthread_attr_setschedparam(&attr, &param); ``` --- #### 三、完整示例代码 ```c #include <pthread.h> void* thread_func(void* arg) { // 线程任务逻辑 return NULL; } int main() { pthread_attr_t attr; pthread_attr_init(&attr); // 设置分离属性 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); // 设置栈大小为2MB pthread_attr_setstacksize(&attr, 2 * 1024 * 1024); pthread_t tid; pthread_create(&tid, &attr, thread_func, NULL); pthread_attr_destroy(&attr); // 无需join分离线程 sleep(1); // 确保线程执行完成 return 0; } ``` --- #### 四、注意事项 1. 属性对象必须在`pthread_create`调用前完成设置 2. 设置调度策略需要`root`权限,否则会返回`EPERM`错误 3. 栈大小设置过小可能导致栈溢出,建议不小于16KB ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

suenpeng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值