一、继承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。
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调用一样用来等待指定的线程。下面我们使用一个实例来解释一下使用方法.在实践中,我们经常要备份一些文件。下面这个程序可以实现当前目录下的所有文件备份。
方式1:继承Thread类 步骤: 1):定义一个类A继承于Java.lang.Thread类. 2):在A类中覆盖Thread类中的run方法. 3):我们在run方法中编写需要执行的操作:run方法里的代码,线程执行体. 4):在main方法(线程)中,创建线程对象,并启动线程. (1)创建线程类。
(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