多线程如何传递多个参数

多线程如何传递多个参数,第1张

将参数放入结构体

例如:

struct someS

{

// 要传递的参数

};

someS ss = new someS;

// 然后对参数进行赋值

// 传递这些参数

CreateThread(……,……,……,(LPVOID)ss,……,……);

java中多线程常见的几个参数

sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)

此 *** 作受到系统计时器和调度程序精度和准确性的影响。

该线程不丢失任何监视器的所属权。

调用sleep的时候锁并没有被释放。

休眠

Java SE5引入了更加显示的sleep()作为TimeUnit类的一部分,这个方法允许你指定sleep()延迟的时间单元,因此可以提供更好的可阅读性。

wait:调用wait使线程挂起,直到线程得到了notify或notifyAll消息,线程才会进入就绪状态。

使你可以等待某个条件发生变化,而改变这个条件超出了当前方法的控制能力。

线程的执行被挂起,对象上的锁被释放。意味着另一个任务可以获得这个锁。

因此在该对象中的其他synchronized方法可以在wait期间被调用。

yield:相当于:我的工作已经做的差不多了,可以让给别的线程使用CPU了。

当调用yield时,你也是在建议具有相同优先级的其他线程可以运行。

对于任何重要的控制或在调整应用时,都不能依赖于yield。

yield并不意味着退出和暂停,只是,告诉线程调度如果有人需要,可以先拿去,我过会再执行,没人需要,我继续执行

调用yield的时候锁并没有被释放。

interrupt:中断线程。

Thread类包含interrupt()方法,因此你可以中止被阻塞的任务。

这个方法将设置线程的中断状态。

如果一个线程已经被阻塞,或者试图执行一个阻塞 *** 作,那么设置这个线程的中断状态将抛出InterruptedException。

当抛出该异常或者该任何调用Threadinterrupted()时,中断状态将复位。

你在Executor上调用shutdownNow(),那么它将发送一个interrupt()调用给他启动的所有线程。

构造一个结构体,其中的成员即为想要传递的参数类型。实例化一个结构体变量obj,将指向该结构体变量obj的指针赋给lpParameter即可。

简单举例:

。。。。。

struct DATA

{

int a;

int b;

int c;

};

DATA d = {1,2,3};

void ThreadName1(LPVOID lpParameter);

static HANDLE hHandle1=NULL;

DWORD dwThreadID1;

int _tmain(int argc, TCHAR argv[], TCHAR envp[])

{

int nRetCode = 0;

hHandle1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)ThreadName1,(LPVOID) &d ,0,&dwThreadID1);

CloseHandle(hHandle1);

ExitThread(0);

return nRetCode;

}

void ThreadName1(LPVOID lpParameter)//参数为int型,传参成功

{

DATA p = (DATA )lpParameter;//类型转换

printf("a = %d\n",p->a);

printf("b = %d\n",p->b);

printf("c = %d\n",p->c);

}

即可实现多参数的传递。

1新开的线程是无法直接访问UI控件的,如果需要访问,可以通过控件的Invoke方法,或者用 SystemThreadingSynchronizationContextCurrentPost方法

2一定不要在控件的内部事件处理方法里面使用Sleep等线程暂停方法!

像我这样写就不会阻塞了:

private void button1_Click(object sender, EventArgs e)

{

SystemThreadingThread thread = new SystemThreadingThread(() =>

{

while (true)

{

thisInvoke(new Action(() =>

{

label1Text = (count++)ToString();

}));

SystemThreadingThreadSleep(100);

}

});

threadIsBackground = true;

threadStart();

}

你把setmess这个线程方法Invoke到了UI的主线程上了,而这个线程里面有暂停方法,所以呢主线程也会暂停卡住。

而我的方法只是把“label1Text = (count++)ToString();”Invoke到主线程,而那个新的线程并没有Invoke到主线程,所以在那个线程里面使用暂停就没事了!

假如有一个 *** 作比较费时,或者需要等待之类的,就像我这样开始一个新的线程,所以的等待 *** 作,费时的 *** 作都在在这个线程里面做,当这些线程需要访问UI控件的时候,就用thisInvoke()这个方法!

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!

vaela

第一个参数ThreadStart也可以是ParameterizedThreadStart,然后在使用threadstart(object para),注意参数类型是object的,所以你可以自己写一个类,用来存你要用的参数。

多线程环境中,通过队列可以很容易实现线程间数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享;同时作为BlockingQueue的使用者,我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue的实现者都给一手包办了。

基于数组的阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,另外还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。

ArrayBlockingQueue在生产者放入数据和消费者获取数据,都是共用同一个锁对象,由此也意味着两者无法真正并行运行,而在创建ArrayBlockingQueue时,我们还可以控制对象的内部锁是否采用公平锁,默认采用非公平锁。

按照实现原理来分析,ArrayBlockingQueue完全可以采用分离锁,从而实现生产者和消费者 *** 作的完全并行运行。

基于链表的阻塞队列,其内部也维持着一个数据缓冲队列(由一个链表构成),当生产者往队列中放入一个数据时,队列会从生产者手中获取数据,并缓存在队列内部,而生产者立即返回;只有当队列缓冲区达到最大值缓存容量时(LinkedBlockingQueue可以通过构造函数指定该值),才会阻塞生产者队列,直到消费者从队列中消费掉一份数据,生产者线程会被唤醒,反之对于消费者这端的处理也基于同样的原理。

对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地 *** 作队列中的数据,以此来提高整个队列的并发性能。

ArrayBlockingQueue和LinkedBlockingQueue间还有一个明显的不同之处在于,前者在插入或删除元素时不会产生或销毁任何额外的对象实例,而后者则会生成一个额外的Node对象。这在长时间内需要高效并发地处理大批量数据的系统中,其对于GC的影响还是存在一定的区别。如果没有指定其容量大小,LinkedBlockingQueue会默认一个类似无限大小的容量(IntegerMAX_VALUE),这样的话,如果生产者的速度一旦大于消费者的速度,也许还没有等到队列满阻塞产生,系统内存就有可能已被消耗殆尽了。

ArrayBlockingQueue和LinkedBlockingQueue是两个最普通也是最常用的阻塞队列,一般情况下,在处理多线程间的生产者消费者问题,使用这两个类足以。

DelayQueue中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue是一个没有大小限制的队列,因此往队列中插入数据的 *** 作(生产者)永远不会被阻塞,而只有获取数据的 *** 作(消费者)才会被阻塞。

DelayQueue用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。

Delayed 是一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。Delayed扩展了Comparable接口,比较的基准为延时的时间值,Delayed接口的实现类getDelay的返回值应为固定值(final)。DelayQueue内部是使用PriorityQueue实现的。

考虑以下场景:

一种笨笨的办法就是,使用一个后台线程,遍历所有对象,挨个检查。这种笨笨的办法简单好用,但是对象数量过多时,可能存在性能问题,检查间隔时间不好设置,间隔时间过大,影响精确度,多小则存在效率问题。而且做不到按超时的时间顺序处理。

这场景,使用DelayQueue最适合了,详情查看 DelayedQueue学习笔记 ; 精巧好用的DelayQueue

基于优先级的阻塞队列(优先级的判断通过构造函数传入的Compator对象来决定),需要注意PriorityBlockingQueue并不会阻塞数据生产者,而只会在没有可消费的数据时,阻塞数据的消费者。

使用时,若生产者生产数据的速度快于消费者消费数据的速度,随着长时间的运行,可能会耗尽所有的可用堆内存空间。在实现PriorityBlockingQueue时,内部控制线程同步的锁采用的是公平锁。

SynchronousQueue是一个内部只能包含零个元素的队列。插入元素到队列的线程被阻塞,直到另一个线程从队列中获取元素。同样,如果线程尝试获取元素并且当前没有线程在插入元素,则该线程将被阻塞,直到有线程将元素插入队列

声明一个SynchronousQueue有公平模式和非公平模式,区别如下:

参考: Java多线程-工具篇-BlockingQueue

12 SynchronousQueue

以上就是关于多线程如何传递多个参数全部的内容,包括:多线程如何传递多个参数、java中多线程常见的几个参数、(1) 如何向线程对应的函数传递参数一个参数如何传递,多个参数如何传递 (2) 深入理解线程与进程的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9508506.html

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

发表评论

登录后才能评论

评论列表(0条)

保存