多线程文章

					关于多线程文章

关于多线程的基本理解

  首先我们得理解任务,线程,cpu之前的关系?
  任务就是我们执行当前想法,线程就是这个需求的执行过程,cpu就是去执行这个线程。
 现在是有多个任务,多个线程,需要cpu去执行,怎么去处理?如果是程序中是单线程,那么多个线程过来得排队,这样影响执行效率,在业务需求没有多的关联关系,我们可以使用多线程。
 解决办法,线程池,多个任务在线程池外等候,当实例了一个线程池,在线程池调度中心,可以接受外部等候的线程过来执行,执行之前线程池中的线程是阻塞的,在调度中心外部某个任务和线程池中线程有对应关系后,这个线程就去执行这个任务,这个时候有多个线程,多个任务,就可以实现多线程对多任务同时处理,实现多线程。

那我们是不是觉得线程池中的线程越多越好呢?
显然不是的,我们程序的执行都是在jvm中开辟一道内存空间,而我们这个内容空间是存在某在一个服务器或者pc机上,是我们本身的资源,资源越多速度肯定会慢下来,而且我们在实例化一个线程池之后,jvm开辟的内存空间就确定了,显然线程池里面的运输线程越多不一定越好。
多线程状态下cpu是怎么执行的?
在多线程状态下,cpu执行是随机的,它不单独执行哪个线程先执行,当我们在代码中由上而下.start()时,其执行也不是我们程序的执行顺序,而是cpu随机启用执行的,在使用多线程技术时,多线程的运行结果和多线程的执行顺序或者调用顺序是无关的。

									**线程的基本概念、线程的基本状态及状态之间的关系**

线程,有时称为轻量级进程,是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、 数据段和其他操作系统资源(如打开文件和信号)。
线程有四种状态:新生状态、可运行状态、被阻塞状态、死亡状态。

										什么是线程,线程和进程的区别是什么

线程,程序执行流的最小执行单位,是行程中的实际运作单位,经常容易和进程这个概念混淆。那么,线程和进程究竟有什么区别呢?首先,进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者。可以说,进程中包含了多个可以同时运行的线程。

									多线程有几种实现方法,都是什么?
			 1. 继承 Thread 类   2. 实现 Runnable 接口再 new Thread(YourRunnableOjbect) 
		
									.什么是多线程?
多线程的实现原理:事实上,同一时间内单核的CPU只能执行一个线程,多线程是CPU快速的在多个线程之间进行切换(调度),造成了多个	线程同时执行的假象。
					




1.基本概念:
		多线程指的是这个程序(一个进程)运行时产生了不止一个线程
并行:
		多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
并发:
		通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往	产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。

并行和并发:在我们看来,都是可以同时执行多种任务,那么,到底他们二者有什么区别呢?

并发,从宏观方面来说,并发就是同时进行多种时间,实际上,这几种时间,并不是同时进行的,而是交替进行的,而由于CPU的运算速度非常的 快,会造 成我们的一种错觉,就是在同一时间内进行了多种事情而并发,则是真正意义上的同时进行多种事情。这种只可以在多核CPU的基础下完成。

								线程安全
	指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存,cpu是不是够用	即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果。
			
								线程的状态

NEW(新建状态)
当一个线程创建以后,就处于新建状态。那什么时候这个状态会改变呢?只要它调用的start()方法,线程就进入了锁池状态。

      								 线程池的作用

线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行,减少创建和销毁线程的次数,每个工作线程可以多次使用,可根据系统情况调整执行的线程数量,防止消耗过多内存

							synchronized的使用

锁的本质是对象实例,对于非静态方法来说,Synchronized 有两种呈现形式,Synchronized方法体和Synchronized语句块。两种呈现形式本质上的锁都是对象实例。

1.锁定实例

public class SynchronizeDemo {
 public void doSth1() {
        /**
         * 锁对象实例 synchronizeDemo
         */
        synchronized (synchronizeDemo){
            try {
                System.out.println("正在执行方法");
                Thread.sleep(10000);
                System.out.println("正在退出方法");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void doSth2() {
        /**
         * 锁对象实例 this 等同于 synchronizeDemo
         */
        synchronized (this){
            try {
                System.out.println("正在执行方法");
                Thread.sleep(10000);
                System.out.println("正在退出方法");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

synchronized块中的方法获取了lock实例的monitor,如果实例相同,那么只有一个线程能执行该块内容

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值