文章框架
线程开启方式
--1通过异步委托实现线程
----11定义线程
----12检测委托线程结束,通过while循环,等待句柄,函数回调
--2通过thread类开启线程
----21定义线程
----22如何传递参数
----23线程优先级
----24线程控制
--3、通过线程池开启线程
--4、通过任务开启线程
----41通过任务或任务工厂
----42连续任务
----43任务的层次结构
----44任务的执行结果
调用线程控制方法启动:ThreadStart();停止:ThreadAbort();暂停:ThreadSuspend();继续:ThreadResume();
值得注意的是: 通过 ThreadAbort() 停下来的线程(或自行运行结束的线程),都无法直接通过 ThreadStart() 方法再次启动,必须重新创建一个线程启动。
注意:线程池中的线程都是后台线程,不能修改为前台线程,不能设置优先级
如果一个任务的执行依赖于另一个任务,即任务的执行有先后顺序。此时,我们可以使用连续任务。
taskContinueWith(ReadNews)表示一个任务task结束后,才开始执行另一个任务。
在一个任务中可以启动子任务,两个任务异步执行。默认情况下,子任务(即由外部任务创建的内部任务)将独立于其父任务执行。使用TaskCreationOptionsAttachedToParent显式指定将任务附加到任务层次结构中的某个父级。
如果父任务执行完了但是子任务没有执行完,则父任务的状态会被设置为WaitingForChildrenToComplete,只有子任务也执行完了,父任务的状态才会变成RunToCompletion。
使用Task的泛型版本,可以返回任务的执行结果。
下面例子中的TaskWithResult的输入为object类型,返回一个元组Tuple<int, int>。
定义调用TaskWithResult的任务时,使用泛型类Task<Tuple<int, int>>,泛型的参数定义了返回类型。通过构造函数,传递TaskWithResult,构造函数的第二个参数定义了TaskWithResult的输入值。
任务完成后,通过Result属性获取任务的结果。
这个问题主要原因在线程设置和线程函数处理。
public partial class Form1: From{
Thread thread = null;
Socket socket = null
Socket listen = null;
public Form1()
{
InitializeComponent();
//初始化socket的代码略……
thread = new Thread(ThreadStart(MyThread));
//设置为后台线程!!!
threadIsBackground = true;
threadStart( );
}
}
private void MyThread()
{
while(true)
{
try
{
socketListen(50);
listen = socketAccept( );
//其他代码略……
}
catch{ }
}
private button1_Click(object sender, EventArgs e)
{
if (thread == null && threadThreadState!=ThreadStateRunning)
{
MessageBoxShow("不处于监听状态");
return;
}
if (threadIsAlive)
{
threadAbort();
}
if (listener != null)
{
listenerStop();
}
label7Text = "监听停止";
}
如何实现多线程
两种方式:
继承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("线程体");
}
}
当然不可以,主函数返回会导致进程结束,进程结束的同时,Windows会结束所有属于这个进程的线程。可是你的主函数可以不返回啊,用WaitForSingleObject(hThread, INFINITE)就可以卡住主函数,等到hThread句柄对应的那个线程结束,这个函数才返回,你可以把它卡在主函数return之前。另外,你有多个线程的话,可以用WaitForMultipleObjects来等待你给定的所有线程结束。 记得要包含windowsh。
函数执行到 Thread d=new Daemon(); 这一句,不是等这一句执行完了再继续执行下一句的,因为d 是一个线程,是并行的执行,有时间片就执行,没有就暂停执行,你把mian函数改成下面的运行一下,看看结果就知道了,我是写web程序的,不怎么用线程,所以只是按照自己的理解说的,错了请指点 ps:(我刚注册的,怎么就有人找到我,百度自动匹配?)
public static void main(String[] args) throws Exception {
Thread d = new Daemon();
for (int i = 0; i < 100; i++) {
Systemoutprintln("=====:"+i);
}
Threadsleep(1);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)