什么是线程、什么又是多线程 它们之间有什么区别呢

什么是线程、什么又是多线程 它们之间有什么区别呢,第1张

说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行

说法二:进程和线程都是由 *** 作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程

线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但 *** 作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

说法三:多线程共存于应用程序中是现代 *** 作系统中的基本特征和重要标志。用过UNIX *** 作系统的读者知道进程,在UNIX *** 作系统中,每个应用程序的执行都在 *** 作系统内核中登记一个进程标志, *** 作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程和线程有什么区别呢?

进程和线程都是由 *** 作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

线程的划分尺度小于进程,使得多线程程序的并发性搞。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但 *** 作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程(Process)是最初定义在Unix等多用户、多任务 *** 作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix *** 作系统为例,进程是Unix *** 作系统环境中的基本成分、是系统资源分配的基本单位。Unix *** 作系统中完成的几乎所有用户管理和资源分配等工作都是通过 *** 作系统对应用程序进程的控制来实现的。

C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从 *** 作系统核心角度来看,进程代表的是 *** 作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由 *** 作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括:

●进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;

●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;

●从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是 *** 作系统指令。

在Unix *** 作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由 *** 作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)。

说法四:应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址,在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。

Java语言中定义的线程(Thread)同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。

Unix *** 作系统和Microsoft Windows *** 作系统支持多用户、多进程的并发执行,而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行, *** 作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程,子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文(Context)。

基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等方面非常廉价。

线程需要 *** 作系统的支持,不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起,提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中,将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里,然后开始做菜。等菜做好了,饭熟了同时衣服也洗好了。

需要注意的是:在应用程序中使用多线程不会增加 CPU 的数据处理能力。只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。

线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

在不开多线程时,单一进程可以说就是一个线程,当我们在写程序时如果所执行的命令会耽误这条线程(例:读取网页、使用判断循环一直循环 等 *** 作)则会导致线程的崩溃或等待即进程假死

使用了多线程后可能会避免以上现象,但不一定会使程序的运行加快(这个例子你写东西的时候会有所体会)

易语言中多线程使用方法:

启动线程(&子程序)

子程序 子程序1

‘这里可以写程序多线程会调用过去

如何实现多线程

两种方式:

继承Thread类,重写run方法

实现Runnable接口,实现run方法。

启动线程调用线程的start方法。

如何用多线程来处理一个问题?

每个线程只完成一个数的累积和,(用线程的参数来传递指定的数),不要把数组里面的所有数都进行计算。

你可以传给线程的时候,除了传递输入输出数组以外,再传递一个index。线程中只处理这个index位置上的数就可以了。

Java线程怎样使用?

Thread线程类,该类有一个共有的无返回值不带参数的run方法。

可以用子类继承Thread类然后重写run方法。

class T extends Thread{public void run(){while(true){Systemoutprintln("xx"); } 范 }使用是声明改自定义类对象,调用start方法启动线程。

Thread t=new T();tstrat();线程启动执行类中run方法中预制的代码。

也可以通过实现线程接口Runnable来创建线程

Thread t=new Thread(new Runnable{public void run(){代码 }});tstart();

多线程有几种实现方法

线程建立/执行:

HANDLE Handle1;

DWORD ID1;

Handle1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&ID1);

线程等待:

WaitForSingleObject(Handle1,INFINITE);

线程同步---生产者消费者:

HANDLE m_S_Consumer;

m_S_Consumer = CreateSemaphore(NULL,0,20, NULL);创建,最多允许有20个产品等待使用,初始0个

ReleaseSemaphore(m_S_Consumer,1,NULL);生产1个

if(WaitForSingleObject(m_S_Consumer,INFINITE) == WAIT_OBJECT_0){消费1个

}

如何使用线程

java平台从开始就被设计成为多线程环境。在你的主程序执行的时候,其它作业如碎片收集和事件处理则是在后台进行的。本质上,你可以认为这些作业是线程。它们正好是系统治理线程,但是无论如何,它们是线程。线程使你能够定义相互独立的作业,彼此之间互不干扰。系统将交换这些作业进或出CPU,这样(从外部看来)它们好象是同时运行的。 在你需要在你的程序中处理多个作业时,你也可以使用多个进程。这些进程可以是你自己创建的,你也可以 *** 纵系统线程。 你进行这些多作业处理,要使用几个不同的类或接口: javautilTimer类

javaxswingTimer类Thread类Runnable接口 对于简单的作业,通常需要重复的,你可以使用javautilTimer类告诉它“每半秒钟做一次”。注重:大多数系统例程是使用毫秒的。半秒钟是500毫秒。 你希望Timer实现的任务是在javautilTimerTask实例中定义的,其中运行的方法包含要执行的任务。这些在Hi类中进行了演示,其中字符串“Hi”重复地被显示在屏幕上,直到你按Enter键。 import javautil;

public class Hi {

public static void main(String args[])

throws javaioIOException {

TimerTask task = new TimerTask() {

public void run() {

SystemoutPRintln("Hi");}};Timer timer = new Timer();

timerschedule(task, 0, 500);

Systemoutprintln("Press ENTER to stop");

Systeminread(new byte[10]);

timercancel();}} Java Runtime Environment工作的方式是只要有一个线程在运行,程序就不退出。这样,当取消被调用,没有其它线程在运行了,则程序退出。有一些系统线程在运行,如碎片收集程序。这些系统线程也被称为后台线程。后台线程的存在不影响运行环境被关闭,只有非后台线程保证运行环境不被关闭。 JavaxswingTimer类与javautiltimer类的工作方式相似,但是有一些差别需要注重。第一,运行的作业被ActionListener接口的实现来定义。第二,作业的执行是在事件处理线程内部进行的,而不象javautilTimer类是在它的外部。这是很重要的,因为它关系到Swing组件集是如何设计的。 假如你不熟悉Swing,它是一组可以被Java程序使用的图形组件。Swing被设计程被称为单线程的。这意味着对Swing类内部内容的访问必须在单个线程中完成。这个特定的线程是事件处理线程。这样,例如你想改变Label组件的文字,你不能仅仅调用Jlabel的setText方法。相反,你必须确认setText调用发生在事件处理线程中,而这正是javaxswingTime类派的上用场的地方。 为了说明这第二种情况,下面的程序显示一个增加的计数器的值。美半秒钟计数器的数值增加,并且新的数值被显示。

C语言如何实现多线程同时运行

使用pthread库执行多线程,这个是Linux下的线程库 Windows下应该有自己的API,不过这种东西一般还是以Linux为标准。pthread_create()创建一个线程,传入fun()的函数指针就行了。

然后这个Beep()的需求要进行线程间通信,可以用共享内存的方法,设一个bool变量flag共享,然后beep的时候设为false,beep完设成true。fun()里面每次看一下这个flag,是false的话就不做动作等下一秒,基本可以满足需求。

这样做的好处是实现简单,但时间是以1s为单位的。如果要8秒结束立刻执行,需要用条件变量的方法来控制,比较复杂,这样的实现方式一个可以满足需求了。

如何在for循环中使用多线程

干脆把 i 当做参数传入好了

class Program

{

static int i;

static void Main(string[] args)

{

i = 0;

do

{

new Thread(new ParameterizedThreadStart(s))Start(i);

i++;

} while (i < 10);

ConsoleRead();

}

static private void s(object index)

{

ConsoleWriteLine(ThreadCurrentThreadManagedThreadId + "," + (int)index);

}

}

如何增加多线程的稳定性

微软官方给出的方案在MSDN里面有说,就是使用ActiveX EXE那种"单元线程模型"

我也曾经试过,的确可以实现"多线程",只是由于要多一个EXE,比较麻烦,后来就没有深入了

结果一次无意中在VBGOOD中看到一段代码,才打通了一个关节:为什么不直接使用ActiveX EXE写程序呢!

那段代码里面,是直接使用这种工程类型,然后在工程内使用CreateObject来生成一个新对象,这样的话,新的对象就工作于一个单元线程内了

其实这个我也知道,可是就没有想到在ActiveX EXE内部使用

看来思路真的不如人还要多多学习,多多积累

ActiveX EXE工程设置为"独立启动"后,貌似只能从Sub Main里进行初始化

而每个对象的建立,都会调用一次这个过程,因此这个过程需要一次性运行

但是MSDN里说得很清楚,在单元线程模型里面,全局变量的范围只能是本单元,因此不能使用设置全局变量来完成这个过程的一次运行逻辑

原代码里使用了GetProp等方式,感觉不是很好,于是作了一下改进,使用事件对象来完成此工作

Sub Main相关代码如下:

Private Const MyEvent As String = "m5home"

Dim hEvent As Long

Sub Main()

If GetEventHandle = 0 Then '由于每个新对象的建立,都要执行Main()过程,因此使用事件对象来进行判断

hEvent = CreateEvent(0&, False, False, MyEvent) '在单元线程下,模块里的全局变量已经没有用了frmMainShow

End If

End Sub

Private Function GetEventHandle() As Long

GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)

Call CloseHandle(GetEventHandle)

End Function

Public Function Quit()

Call CloseHandle(hEvent)

End Function

Private Const MyEvent As String = "m5home"

Dim hEvent As Long

Sub Main() If GetEventHandle = 0 Then '由于每个新对象的建立,都要执行Main()过程,因此使用事件对象来进行判断

hEvent = CreateEvent(0&, False, False, MyEvent) '在单元线程下,模块里的全局变量已经没有用了frmMainShow

End If

End Sub

Private Function GetEventHandle() As Long GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)

Call CloseHandle(GetEventHandle)

End Function

Public Function Quit()

Call CloseHandle(hEvent)

End Function

由于事件对象是系统范围的,因此可>>

怎样用纯C写一个多线程的程序

这是我以前写的一个多线程范例,凑合看看吧:

#include

#include

#include

using namespace std;

提示出租车到达的条件变量

pthread_cond_t taxiCond;

同步锁

pthread_mutex_t taxiMutex;

旅客到达等待出租车

void traveler_arrive(void name)

{

cout<< " Traveler: " <<(char )name<< " needs a taxi now! " <

pthread_mutex_lock(&taxiMutex);

pthread_cond_wait (&taxiCond, &taxiMutex);

pthread_mutex_unlock (&taxiMutex);

cout<< " Traveler: " << (char )name << " now got a taxi! " <

pthread_exit( (void )0 );

}

出租车到达

void taxi_arrive(void name)

{

cout<< " Taxi " <<(char )name<< " arrives " <

pthread_cond_signal(&taxiCond);

pthread_exit( (void )0 );

}

int main()

{

pthread_t thread;

pthread_attr_t threadAttr;

pthread_attr_init(&threadAttr);

pthread_create(&thread, & threadAttr, taxi_arrive, (void )( " Jack " ));

sleep(1);

pthread_create(&thread, &threadAttr, traveler_arrive, (void )( " Susan " ));

sleep(1);

pthread_create(&thread, &threadAttr, taxi_arrive, (void )( " Mike " ));

sleep(1);

return 0;

}>>

线程是什么,什么时候使用线程,如何使用线程?

如果用书面语,那你还不如看书呵,还是通俗点。

线程:

举例:如果你开着QQ,需要和多人进行语音,那么,你邀请一位朋友进行连接,就需要开辟一条线程,用于保持连接和传递数据。它和进程不同,具体的内容可以百度下:线程和进程的区别。

使用:

一般会在同时触发多项任务时使用线程,比如服务器和客户端的连接,作为服务器,我需要接受多个客户端的访问,每个客户端的 *** 作又都不一样,但都需要服务器去处理,那么作为服务器我会创建专属于该客户端的一个连接(一个线程去hold住它),通过互相传递指令去执行任务。

创建:

有2种方法:

推荐用:

public class TestRun implements Runnable{ 第一步实现Runnable接口

public TestRun(){

new Thread(this)start(); 第三步启动线程

}

public void run(){ 第二步实现run方法,该方法为接口中抽象方法

Systemoutprintln("线程体");

}

}

以上就是关于什么是线程、什么又是多线程 它们之间有什么区别呢全部的内容,包括:什么是线程、什么又是多线程 它们之间有什么区别呢、易语言多线程怎么理解、多线程怎么用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9457678.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存