LZ这几天看到一些java初级工程师就像我们应届毕业生在去面试的时候都会或多或少问到多线程的概念,确实,这部分的内容对一个搞开发的十分的重要,掌握了就是你的优势。LZ将部分重点内容总结一下,以便和大家共享以及方便自己以后查看。
如下图所示,进程是一个独立的运行环境,可以被称作一个程序或者一个应用,而线程就是在进程中的一个任务,即一个执行路劲,像我们平时打开电脑的任务管理器,里面看到的都是正在运行的进程,QQ是其中的一个,而我们在QQ中聊天发表说说则是一个个的线程。 图1:进程和线程的关系图
在一个应用程序中,同时有多个不同的执行路径,这就是多线程,举个例子就是在用微信聊天的时候还去对微信其他部分的东西进行操作。
一句话:提高了程序的运行效率。
这个问题很好理解,要点就是在线程执行某个请求时,是否需要一段时间返回信息才能继续往下执行,同步是需要的,异步不需要,它是直接执行厦门的操作,不管其他进程的状态。如下图:
创建线程基础的有两种方法,一种是继承thread类,重写run方法;一种是继承Runnable接口,重写run方法;注意启动一个线程用.start方法,这里需要注意的是与run方法的区别,调用run方法只是正常的调用普通的方法,而.start方法才是启动一个线程;另外考官可能会问你这两种方式那种比较好,回答应该是后者实现接口比较好,原因是实现接口的方式还可以继承其他类,但是我们的类却只能继承一个父类(Java类只能继承一个父类),所以前者会产生局限性。
就是在多个线程共享同一个数据会受到其他线程的干扰,可能会造成死锁,程序处于无限等待中。解决办法是采取线程同步技术,用上锁(synchronized),让一个线程执行完了,再让其他线程执行。上面提到死锁概念,觉得有必要提一下:
就是两个或两个以上的线程都在等待对方执行完毕才能继续往下执行就发生了死锁,线程处于无限的等待中。 死锁有四个条件: 禁止抢占 no PReemption 持有和等待 hold and wait 互斥 mutual exclusion 循环等待 circular waiting 当线程A要去读取B线程已经删除的数据的时候,就会出现错误。解决死锁有几个方法,最简单的方法:重启系统,更好的方法是终止一个线程的运行,可以把一个线程或多个线程回滚到前一状态。 未完待续… (后面会补充线程池,生产者消费者模式等知识,都是基础需要掌握的内容。)
新闻热点
疑难解答