Thread:
前言:
我们为什么会使用多线程?首先因为我们适合的场景下合理使用多线程可以有效的将我们这种多核CPU的这种并行的能力发挥出来,但是我们首先要注意的是当我们 在使用多线程的时候也要注意几个重要的问题:1.当前场景下适不适合使用:比如说有的场景下需要几个方法有序的执行或者是一个方法需要另一个方法的返回值等等,像这种场景下就不适合使用多线程2.当我们的电脑是单核单cpu的时候我们其实使用并行比串行更加的浪费时间(多了上下文切换的事件)
注意点:
1.线程同步:我们在多线程的场景下什么时候会用到线程同步呢?在对全局变量进行写操作的时候,这个时候我们为了保证原子性通常会采用线程同步的方式,但是这个时候我们需要注意的是首先是一个是内存可见性问题以及如果有多个锁的话我们也需要考虑死锁的问题
2.锁的粒度问题:
我们在多线程的场景下进行线程同步的时候,我们也要注意,尽可能的减少锁的粒度,尽量使用分段锁来代替那种很大的同步代码块。
3.volatile关键字的原理:
我们都知道volatile关键字可以保证内存的可见性,那么什么是内存的可见性,我们都知道,在内存模型中,我们有主存,高速缓存(L1),高速缓存(L2)以及cpu的级别的缓存(L3),当我们进行全局变量的操作的时候首先会将数据从主存中读到线程的调用栈中然后进行对应的操作,假如我们没有加volatile关键字的时候我们操作的仅仅是自己的本地缓存的变量,不能及时的将数据刷新或者获取到主存,这个时候显然数据可能出现问题,当我们使用volatile关键字的时候,因为我们在主存中读取数据的时候是依靠缓存行进行读取的,当我们在线程的本地调用栈将数据进行更改的时候,它会将该缓存行标记为失效缓存行,并将值刷新到主存,这样别的线程就会重新去主存中读取数据,也就避免了上面的问题!
Thread
//创建一个1线程
Thread t1 = new Thread(() => { });
//启动线程
t1.Start();
//线程有关的属性:
//线程的优先级
ThreadPriority priority = t1.Priority;
//线程是不是后台线程
bool isBackground = t1.IsBackground;
//线程状态
ThreadState threadState = t1.ThreadState;
//表示当前线程等待某个线程执行完在继续执行,参数为TimeSpan,可以指定时间,过期不候
t1.Join();
//线程休眠
Thread.Sleep(TimeSpan.FromSeconds(90));
以上就是Thread常用的方法了,我们下一次将探讨的是异步任务的使用以及需要注意的点。
ThreadPool
1.什么是池化技术:
我们通常在使用线程的时候都是直接new一个线程,其实这种不仅会使我们的响应速度变慢,并且这种直接新建线程的方式也是十分的不友好的,增加了许多新建线程的开销。最好的方式就是使用线程池的技术,那么我们应该怎么使用他呢?
ThreadPool.QueueUserWorkItem(代码逻辑实现);
//其中的参数为一个参数的委托