`

多线程概念

阅读更多
Thread和Runnable的区别
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。

总结:

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类



提醒一下大家:main方法其实也是一个线程。在java中所以的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。

在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个jVM实习在就是在操作系统中启动了一个进程。


线程状态转换
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁)
5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。



sleep()和yield()的区别
        sleep()和yield()的区别):sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
        sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前线程让出 CPU 占有权,但让出的时间是不可设定的。实际上,yield()方法对应了如下操作:先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把 CPU  的占有权交给此线程,否则,继续运行原来的线程。所以yield()方法称为“退让”,它把运行机会让给了同等优先级的其他线程
       另外,sleep 方法允许较低优先级的线程获得运行机会,但 yield()  方法执行时,当前线程仍处在可运行状态,所以,不可能让出较低优先级的线程些时获得 CPU 占有权。在一个运行系统中,如果较高优先级的线程没有调用 sleep 方法,又没有受到 I\O 阻塞,那么,较低优先级线程只能等待所有较高优先级的线程运行结束,才有机会运行。


    wait和sleep区别
共同点:
1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
   如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep /join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
   需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。
不同点:
1. Thread类的方法:sleep(),yield()等
   Object的方法:wait()和notify()等
2. 每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
   sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
所以sleep()和wait()方法的最大区别是:
    sleep()睡眠时,保持对象锁,仍然占有该锁;
    而wait()睡眠时,释放对象锁。
  但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException(但不建议使用该方法)。
sleep()方法
sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;
   sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。
  在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。
wait()方法
wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问;
  wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。
  wiat()必须放在synchronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException“异常。
分享到:
评论

相关推荐

    C#多线程概念及举例介绍

    ### C#多线程概念及举例介绍 #### 一、多线程概念 在计算机科学领域,多线程是指在单个程序中可以同时运行多个不同的线程来执行不同的任务。这种方式可以更好地利用CPU资源,提高程序的执行效率。线程是操作系统...

    Java多线程概念及应用详细解析

    Java多线程概念及应用详细解析.mht,I love java

    c#多线程的奥妙,多线程的概念STAThread教程+源代码,非常好的.

    本教程将深入探讨C#中的多线程概念以及STAThread特性,并提供相关的源代码示例,帮助你更好地理解和应用这一技术。 首先,我们来理解什么是多线程。在单线程程序中,任务是按顺序执行的,而多线程则允许多个任务...

    12.1 Qt5多线程:多线程及简单实例

    多线程概念** 多线程是指在一个进程中同时执行多个独立的代码段,每个代码段称为线程。这种并行处理可以提高程序的执行效率,尤其是在处理I/O密集型或计算密集型任务时,可以显著提升用户体验。 **2. Qt5中的线程*...

    Linux系统下的多线程编程入门.pdf

    本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程概念 多线程是指在一个进程中可以同时执行多个独立的代码段,每个代码...

    利用VB6实现多线程

    一、多线程概念 多线程是指在一个应用程序中存在多个并行执行的线程,它们共享同一内存空间,但各自拥有独立的执行流。通过多线程,可以实现任务的并发执行,比如在用户界面更新的同时,后台进行数据处理,提升用户...

    Java多线程完全概念题

    以上只是Java多线程概念题的一部分,理解并熟练运用这些概念对于编写高效、稳定的并发程序至关重要。在实际开发中,还需要考虑线程安全、死锁、活锁、饥饿等问题,并合理利用线程池(ThreadPoolExecutor)优化线程...

    JAVA单线程多线程

    ### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...

    多线程例子 演示多线程使用

    1. **多线程概念**:在单核CPU中,多线程是通过时间片轮转的方式实现的,即操作系统快速切换线程的执行状态,给人一种同时运行多个任务的错觉。在多核CPU中,每个核心可以并行执行不同的线程,真正实现并发执行。多...

    C++多线程编程入门教程

    本文将对C++多线程编程进行详细的介绍,从多线程概念的定义到实际的编程实现。同时,文章还将对Linux和Windows平台下的多线程实现进行比较,并提供了相关的示例代码。 一、多线程概念 在现代计算机系统中,多线程...

    delphi7 多线程测试(40个线程)

    以下是一些关键的多线程概念和技巧: - **线程优先级**:调整线程优先级可以帮助平衡系统资源,但过度依赖优先级可能导致优先级反转和死锁,应谨慎使用。 - **线程池**:使用线程池可以重用已创建的线程,减少创建...

    C++多线程SOCKET收发

    下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让我们了解多线程。在单线程程序中,执行流是线性的,一次只能处理一个任务。而多线程则允许多个任务(线程)...

    易语言多线程多次启动一个子程序

    二、多线程概念 多线程是指在一个进程中可以同时执行多个不同的线程。每个线程都有自己的执行路径,它们共享进程的内存空间,但各自拥有独立的执行栈。在易语言中,通过创建和管理线程,可以实现并发执行任务,提高...

    多线程并行运算

    一、多线程概念 多线程是指在一个应用程序中同时运行多个独立的执行线程。每个线程都包含有自己的程序计数器、系统寄存器和栈,它们可以并发执行任务,从而使得程序能够同时处理多个不同的任务或同一任务的不同部分...

    多线程编程的入门教程

    通过这个标题,我们可以推断文档内容会从最基础的多线程概念讲起,逐渐过渡到实际编程技巧和例子。 描述部分提到的“适合初学者学习多线程”,表明文档的编写目的是为了让那些对多线程编程一无所知的读者能够理解并...

    多线程开发及其源代码

    一、多线程概念理解 1. 线程:线程是程序执行的最小单位,一个进程中可以包含多个线程,它们共享同一内存空间,但各自拥有独立的执行流。 2. 单线程与多线程:单线程程序只有一个执行流,而多线程程序则可以同时处理...

    多线程实例,线程实例

    一、多线程概念 多线程是指在一个进程中创建两个或更多的执行线程,每个线程都有自己的独立运行路径。它们共享同一内存空间,包括全局变量和静态变量,但各自拥有独立的栈空间,可以并行执行不同的任务。通过多线程...

    C#多线程编程实战完整源码

    本资源"《C#多线程编程实战》完整源码"提供了丰富的实例,适用于学习和实践C#中的多线程概念。 在C#中,多线程允许应用程序同时执行多个独立的任务,提高系统利用率并优化性能。.NET框架为开发者提供了强大的支持,...

    多线程定时器Web和Winform双版本

    1. **多线程概念**: - 在计算机编程中,多线程是指一个程序内同时执行的多个独立流程。这使得应用程序能够并发处理不同的任务,提高资源利用率和响应速度。 - 多线程环境可以避免单一主线程阻塞,提高用户体验,...

    易语言多线程源码

    在本文中,我们将深入探讨易语言的多线程概念、实现方式以及它在实际应用中的价值。 首先,多线程是现代编程中的一个重要概念,尤其是在处理复杂任务和提高系统效率时。它允许一个程序同时执行多个不同的任务,每个...

Global site tag (gtag.js) - Google Analytics