`

总结---多线程(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

分享到:
评论

相关推荐

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

    "Java多线程-知识点梳理和总结-超详细-面试知识点" Java多线程是Java编程语言中最基本也是最重要的概念之一。多线程编程可以提高程序的执行效率、改善用户体验和提高系统的可扩展性。但是,多线程编程也存在一些...

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

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    Java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...

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

    以下是对C++多线程编程的一些总结和实例讲解: 1. **并发**:并发是多线程的核心,它允许程序在多个线程间分配工作,从而提高整体性能。C++11及更高版本提供了`std::thread`库来支持线程创建和管理。生产者-消费者...

    自己总结的多线程

    ### 多线程基础 #### 1. 多线程概念 多线程是指在一个程序中包含多个控制流,它们可以并发执行不同的任务。在Java中,多线程的实现通常借助于`Thread`类或实现`Runnable`接口。多线程能够提高CPU的利用率,改善应用...

    windows多线程总结

    【Windows多线程总结】 Windows操作系统提供了一套完整的API来支持多线程编程,使得开发者可以在同一进程中同时执行多个线程,实现并发处理任务。本文将深入探讨Windows多线程编程的基本概念、线程同步、线程池以及...

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

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

    C#内存释放-线程控制-线程启动-线程暂停

    此外,`volatile`关键字可用于确保多线程环境中的数据一致性,确保所有线程都能看到最新值。 在Windows Forms应用程序中,主线程(UI线程)负责更新用户界面。因此,长时间运行的操作不应在主线程上执行,以免阻塞...

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

    在IT领域,多线程和多进程编程是提高系统效率和并发能力的重要手段。下面将详细阐述这些概念及其相关的知识点。 一、多线程和多进程 1. 进程的创建与使用: - `fork()`:创建新进程,复制调用进程的所有资源,两...

    并发服务器-多线程服务器详解

    ### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...

    面试知识点总结--线程.pdf

    这有助于在多线程环境下保证数据的一致性。 3. **不推荐使用的线程控制方法**: - `stop()`:不推荐使用,因为它会强制终止线程,可能会导致对象处于不一致的状态,进而引发不可预测的行为。 - `suspend()`:同样...

    JVM调优总结 -Xms -Xmx -Xmn -Xss

    在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。 在 JVM 调优中,还需要考虑垃圾回收器的选择。JVM 给了三种选择:串行...

    多线程知识总结

    ### 多线程知识总结 #### 一、线程基础概念 **线程状态:** 在探讨多线程之前,我们需要了解线程的基本状态转换。一个典型的线程生命周期包括以下几个阶段: 1. **Start(启动):** 当线程被创建后调用`start()`...

    MFC多线程完整总结及示例代码

    MFC 多线程完整总结及示例代码 多线程是一种重要的编程技术,用于实现并行处理和提高系统性能。在 MFC 中,多线程编程可以通过 Win32 API 函数和 MFC 类库来实现。在本文中,我们将对多线程的基本概念、多线程编程...

    JavaSE专题-多线程总结.doc

    JavaSE专题的多线程是Java编程中至关重要的一部分,它涉及到如何在单个程序中同时执行多个任务。以下是对多线程技术的详细说明: 1. **多线程技术介绍** - **进程**:一个进程是操作系统分配给应用程序的内存空间...

    andorid- 多线程

    ### Android多线程知识点解析 #### 一、多线程的重要性及原理 在Android应用程序开发中,使用多线程技术可以显著提升应用的性能和用户体验。由于Android的应用程序默认运行在一个名为“主线程”(Main Thread)的...

    java多线程编程总结

    ### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的...

    多线程精心总结

    【多线程精心总结】 在Java编程中,多线程是一种重要的并发处理方式,它可以提高程序的执行效率,尤其在处理大量并发任务时。本文将深入探讨Java线程中的几个关键概念,包括`yield()`、`sleep()`、`wait()`、`join...

Global site tag (gtag.js) - Google Analytics