1.关于多线程存在的意义:
首先,既然有多线程,存在既有意义,那么为什么存在多线程呢,多线程的用处在何处呢我的理解如下在;
(1)多核的到来促使多线程的发展,如果是单核cpu的话,那么所谓的多线程也只是多个线程抢占CPU资源而已,而同一时间执行的线程只有一个,多线程可以说是进程的基本单位咯,线程之间共享资源,而进程之间通信是非常麻烦的,多核的到来可以让一个进程分为多个线程模型然后让不同的cpu处理不同的线程从而促使多个线程并行计算,大大降低计算的时间,提高各种应用场景的销效率
(2)阻塞,阻塞的处理也是多线程的用处所在,首先如果单个线程的话,当程序在某一行命令执行阻塞,一直没有响应的话,那么对于客户端的请求来说那就一直等?如果多线程的话,就是将一个程序分为多个线程,某一个线程阻塞了,但并不影响其他线程的执行,这样可以实现异步,也就是请求即时响应,但是并没有真正的响应结果,客户端会等待,什么时候有结果了再响应,可以参考同步通信和异步通信,我说的也只是我的浅显理解,可能有错。。。。
(3)分块处理,如果将一个进程建模,那就太大太麻烦了,如果利用多线程的话,分为多个线程,然后对应建立模型,那样就可以简单化编程。
2.线程的生命周期:
新建状态:使用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序start()这个线程。
就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
运行状态:如果就绪状态的线程获取 CPU 资源,就可以执行run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:
等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态
3.线程的创建方式
实现Runnable接口,继承Thread类,或者通过callable和future和futuretask来实现,实现接口更好些,面向接口更符合面向对象的轻耦合的思维
关于runnable和callable的不同点:
两者最大的不同点是:实现Callable接口的任务线程能返回执行结果;而实现Runnable接口的任务线程不能返回结果
Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛
4.线程和进程的关系:
写着写着突然想起来进程线程之间的关系,就贴上来吧,权当复习了233:
进程:每个进程都有自己独立的代码和数据空间也就是进程上下文,进程间的通信与切换有较大的开销,一个进程包括多个线程(包括1 =)进程是操作系统分配资源的最小单位
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。多进程是指操作系统能同时运行多个任务(程序)。多线程是指在同一程序中有多个顺序流在执行。
5.。。还有很多我就不说了、、快下班了来Oracle的第二天