创建一个新线程

问题描述:创建线程有哪几种方式 这篇文章主要介绍了创建一个新线程时新线程和父线程都执行原来的代码吗,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。

如何在VC中利用系统函数创建一个新的线程

创建一个新线程的相关图片

一、继承Thread类创建

通过继承Thread并且重写其run(),run方法中即线程执行任务。创建后的子类通过调用 start() 方法即可执行线程方法。

通过继承Thread实现的线程类,多个线程间无法共享线程类的实例变量。(需要创建不同Thread对象,自然不共享)

二、 通过Runnable接口创建线程类。

该方法需要先 定义一个类实现Runnable接口,并重写该接口的 run() 方法,此run方法是线程执行体。接着创建 Runnable实现类的对象,作为创建Thread对象的参数target,此Thread对象才是真正的线程对象。通过实现Runnable接口的线程类,是互相共享资源的。

三、 使用Callable和Future创建线程。

从继承Thread类和实现Runnable接口可以看出,上述两种方法都不能有返回值,且不能声明抛出异常。而Callable接口则实现了此两点,Callable接口如同Runable接口的升级版,其提供的call()方法将作为线程的执行体,同时允许有返回值。

但是Callable对象不能直接作为Thread对象的target,因为Callable接口是 Java 5 新增的接口,不是Runnable接口的子接口。对于这个问题的解决方案,就引入 Future接口,此接口可以接受call() 的返回值,RunnableFuture接口是Future接口和Runnable接口的子接口,可以作为Thread对象的target 。并且, Future 接口提供了一个实现类:FutureTask 。

FutureTask实现了RunnableFuture接口,可以作为 Thread对象的target。

c语言中如何创建新的线程的相关图片

c语言中如何创建新的线程

CreateThread函数可以用来创建一个线程,在MSDN中查找这个函数得到如下信息:"The CreateThread function creates a thread to execute within the address space of the calling process."和"If the function succeeds, the return value is a handle to the new thread."所以我们得定义一个句柄用来存放它的返回值。还定义一个指向线程ID的DWORD值dwThreadId。然后我们就可以用CreateThread函数来创建我们的线程了,CreateThread函数有六个参数分别是。

LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes。

DWORD dwStackSize, // initial thread stack size。

LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function。

LPVOID lpParameter, // argument for new thread。

DWORD dwCreationFlags, // creation flags。

LPDWORD lpThreadId // pointer to receive thread ID。

其中第一个参数我们设置为NULL,使这个句柄不能被继承;第二个参数设置为0,使用默认的堆栈大小;第三个参数为线程函数的起始地址,也就是线程函数的函数名;第四个参数为NULL,没有值要传递给线程函数;第五个参数为0,创建好之后马上让线程运行;第六个参数设置为指向线程ID的地址。创建好线程之后,线程函数进行初始化之类的操作,主函数继续执行,此时可以输出被创建线程的ID。我们在主函数中用WaitForSingleObject函数来等待线程函数变成受信(signaled)状态,它的两个参数分别是。

HANDLE hHandle, // handle to object to wait for。

DWORD dwMilliseconds // time-out interval in milliseconds。

第一参数为线程函数的句柄,第二个参数设置为INFINITE,等待线程一直执行完。在程序的最后还要记得用CloseHandle函数关闭线程,这样主函数就写完了。

在线程函数里面我们可以简单地做一些工作,比如设置一个循环,让它输出一定的信息等。源程序如下:

#include <windows.h>。

#include <iostream.h>。

DWORD WINAPI ThreadFunc(HANDLE Thread)。

int i;

for(i=0;i<10;i++)。

cout<<"A new thread has created!"<<endl;。

return 0;

int main(int argc,char* argv[])。

HANDLE Thread;

DWORD dwThreadId;。

Thread=::CreateThread。

(NULL,0,ThreadFunc,NULL,0,&dwThreadId);。

cout<<"The new thread ID is :"<<dwThreadId<<endl;。

::WaitForSingleObject(Thread,INFINITE);。

::CloseHandle(Thread);。

return 0;

在Window xp sp2&VC++ 6.0环境下编译通过。

如何创建线程的相关图片

如何创建线程

进程的生命周期:[1].创建 --- fork [2].执行 --- a. execb.子进程实现代码逻辑[3].结束 --- exit _exit僵尸态进程---wait waitpid孤儿进程--------------------------------------进程存在的问题:(1).进程的创建 --- 复制(时间 和 空间的开销很大)(2).进程的运行 --- 调度-->。

pthread_create创建一个线程,thread是用来表明创建线程的ID,attr指出线程创建时候的属性,我们用NULL来表明使用缺省属性。start_routine函数指针是线程创建成功后开始执行的函数,arg是这个函数的唯一一个参数。表明传递给start_routine的参数。

pthread_exit函数和exit函数类似用来退出线程.这个函数结束线程,释放函数的资源,并在最后阻塞,直到其他线程使用pthread_join函数等待它。然后将*retval的值传递给**thread_return.由于这个函数释放所以的函数资源,所以retval不能够指向函数的局部变量。

pthread_join和wait调用一样用来等待指定的线程。下面我们使用一个实例来解释一下使用方法.在实践中,我们经常要备份一些文件。下面这个程序可以实现当前目录下的所有文件备份。

Java开发如何创建一个线程?的相关图片

Java开发如何创建一个线程?

方式1:继承Thread类 步骤: 1):定义一个类A继承于Java.lang.Thread类. 2):在A类中覆盖Thread类中的run方法. 3):我们在run方法中编写需要执行的操作:run方法里的代码,线程执行体. 4):在main方法(线程)中,创建线程对象,并启动线程. (1)创建线程类。

windows系统中创建线程常用哪几个函数,有什

(1)通过扩展Thread类来创建多线程。

public static void main(String [] args){。

        MutliThread m1=new MutliThread("Window 1");。

        MutliThread m2=new MutliThread("Window 2");。

        MutliThread m3=new MutliThread("Window 3");。

        m1.start();。

        m2.start();。

        m3.start();。

    }

class MutliThread extends Thread{。

    private int ticket=100;//每个线程都拥有100张票。

    MutliThread(String name){。

        super(name);//调用父类带参数的构造方法。

    }

    public void run(){。

        while(ticket>0){。

            System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());。

        }

    }

(2)通过实现Runnable接口来创建多线程。

 public static void main(String [] args){。

        MutliThread m1=new MutliThread("Window 1");。

        MutliThread m2=new MutliThread("Window 2");。

        MutliThread m3=new MutliThread("Window 3");。

        Thread t1=new Thread(m1);。

        Thread t2=new Thread(m2);。

        Thread t3=new Thread(m3);。

        t1.start();。

        t2.start();。

        t3.start();。

    }

class MutliThread implements Runnable{。

    private int ticket=100;//每个线程都拥有100张票。

    private String name;。

    MutliThread(String name){。

        this.name=name;。

    }

    public void run(){。

        while(ticket>0){。

            System.out.println(ticket--+" is saled by "+name);。

        }

    }

原文地址:http://www.qianchusai.com/%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%96%B0%E7%BA%BF%E7%A8%8B.html

D3028时刻表,d3201时刻表查询

D3028时刻表,d3201时刻表查询

easyuefi备份引导,easyuefi怎么设置启动项

easyuefi备份引导,easyuefi怎么设置启动项

sailing-30

sailing-30

witness-160

witness-160

红米k30pro破解90hz,红米k30pro破解高刷新率

红米k30pro破解90hz,红米k30pro破解高刷新率

subnet-250

subnet-250

harpooneer

harpooneer

melanin-100

melanin-100

4531-180

4531-180

1650ti显卡吃鸡有压力吗,1650ti吃鸡能开什么画质

1650ti显卡吃鸡有压力吗,1650ti吃鸡能开什么画质