`

总结---多线程(2)

阅读更多

线程的优先级:  

线程的优先级是系统在给线程分配CPU时间片的概率,当多个线程处于执行状态等待CPU分配时间片的时候,优先级越高他获得CPU时间片的几率就越大,反之就越小。线程的优先级在1-10之间,默认为5。MAX_PRIORITY线程可以具有的最高优先级。MIN_PRIORITY线程可以具有的最低优先级。NORM_PRIORITY分配给线程的默认优先级。我们可以使用getPriority()和setPriority(int newPriority) 获得和更改线程的优先级。

线程的同步:

因为同一进程的多个线程共享同一片存储空间, 所以在多个线程同时访问同一个资源时会发生冲突,对资源造成破坏,线程同步就避免了这个问题。

同步的前提:同步需要两个或者两个以上的线程。多个线程使用的是同一个锁。未满足这两个条件,不能称其为同步。
实现线程同步的两种方法:

1. synchronized 方法:在方法中加上synchronized关键字来声明同步。例:
private synchronized void show()

synchronized 方法控制对类成员变量的访问,可以将其看做一把锁,每个synchronized 方法都必须获得这把锁方能执行,当一个线程进入方法后,独占该锁,其他的线程进入阻塞状态,只有当方法返回后独占锁的线程才会放开锁,其他阻塞的线程才有可能获得这把锁,这就保证了被声明为synchronized的方法最多只有一个处于可执行状态,从而避免了访问冲突。
2. synchronized 块:通过 synchronized关键字来声明synchronized 块。例:
synchronized(Object) { 需要控制的代码 }
使用synchronized 块,必须声明在哪一个对象的操作上同步,即获取哪一个对象的锁。它的相对于synchronized 方法的优点是同步方法只能有一个锁即this,而synchronized 块可以指定多个锁,灵活性高。具体实现同步的机制与使用synchronized 方法类似。

死锁:

虽然线程的同步解决了数据资源安全性的问题,但是比较消耗资源。假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭。他们都需要获得两个锁:共享刀和共享叉的锁。假如线程 "A" 获得了刀,而线程 "B" 获得了叉。线程 A 就会进入阻塞状态来等待获得叉,而线程 B 则阻塞来等待 A 所拥有的刀。在当两个线程被阻塞,每个线程在等待另一个不可能释放的线程时,就会产生死锁,程序死掉,死锁在java中很复杂的,难于发现不易解决。

线程间的通信:

Java提供了3个非常重要的方法来巧妙地解决线程间的通信问题。这3个方法分别是:wait()、notify()和notifyAll()。它们都是Object类的一部分而不像sleep()那样属于Thread类的一部分。(为什么呢? 1,这些方法存在与同步中。2,使用这些方法时必须要标识所属的同步的锁。 3,锁可以是任意对象,所以任意对象调用的方法一定定义Object类中。

wait(),sleep()有什么区别? wait():释放资源,释放锁。 sleep():释放资源,不释放锁。)

虽然所有的类都默认拥有这3个方法,但是只有在synchronized关键字作用的范围内,并且是同一个同步问题中配合使用这3个方法时才有实际的意义。调用wait()方法可以使调用该方法的线程释放共享资源的锁,然后从运行态退出,进入等待队列,直到被再次唤醒。而调用notify()方法可以唤醒等待队列中第一个等待同一共享资源的线程,并使该线程退出等待队列,进入可运行态。调用notifyAll()方法可以使所有正在等待队列中等待同一共享资源的线程从等待状态退出,进入可运行状态,线程池中的第一个等待的线程先获得运行。显然,利用这些方法就不必再循环检测共享资源的状态,而是在需要的时候直接唤醒等待队列中的线程就可以了。这样不但节省了宝贵的CPU资源,也提高了程序的效率。


守护线程:

守护线程是一类特殊的线程,当一个应用程序的所有非守护线程终止运行时,即使仍然有守护线程在运行,应用程序也将终止,反之,只要有一个非守护线程在运行,应用程序就不会终止。可以通过调用方法 isDaemon() 来判断一个线程是否是守护线程,也可以调用方法 setDaemon(boolean b) 来将一个线程设为守护线程。


中断线程:

1.1.定义循环结束标记
l因为线程运行代码一般都是循环,只要控制了循环就可以控制线程的结束。
2.2.使用interrupt(中断)方法。
l该方法是结束线程的冻结状态,使线程回到运行状态中来。但是如果线程在调用Object类的wait()、wait(long)或wait(long,int)方法,或者该类的join(),join(long),join(long,int)或sleep(long),sleep(long,int)方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liuxiaolei7676/archive/2010/04/03/5448456.aspx

分享到:
评论

相关推荐

    C++-多线程编程总结-实例讲解.doc

    C++-多线程编程总结-实例讲解.doc

    Java多线程-知识点梳理和总结-超详细-面试知识点.docx

    Java多线程-知识点梳理和总结-超详细-面试知识点.docx

    java多线程编程总结

    详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...

    Java多线程-多线程知识点总结和企业真题

    Java多线程--多线程知识点总结和企业真题

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt ...微软.Net开发中的多线程编程总结.txt 线程中的参数传递.txt

    java多线程总结(一)

    java多线程总结

    第二次学习总结-多线程多进程学习.docx

    刚接触linux的多线程编程,总结基础知识并编写socket通信的多线程多进程代码,已经验证可行,包括共享队列、套接字、循环队列、Makefile编写、动态库静态库编译和使用等。具体代码请看多线程多进程的事例分享。

    Java多线程知识点总结

    该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!

    Java多线程的总结

    Java多线程的重要性可想而知,而对于多线程,某些情况下,又比较难理解,稍微参照网上的资料进行了总结

    corejava多线程学习总结.pdf

    corejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习总结.pdfcorejava多线程学习...

    自己总结的多线程

    多线程 , java,多线程并发,对于多线程的原理以及使用做了初步的介绍

    MFC 多线程总结

    MFC 多线程总结, 开发为于windows的应用程序开发

    windows多线程总结

    这是我学习win32多线程的经验结晶,其中比较全面的叙述了WIN32多线程的基本编程方法。

    定位多线程内存越界问题实践总结

    最近定位了在一个多线程服务器程序...整个定位过程遇到的问题和解决办法对于多线程内存越界问题都很典型,简单总结一下和大家分享。只对终极组合秘技感兴趣的同学,请直接阅读最后一节,其他的章节写到这里是为了科普。

    gdb调试多线程程序总结

    gdb调试多线程程序总结 gdb调试多线程程序总结

Global site tag (gtag.js) - Google Analytics