`
longgangbai
  • 浏览: 7331410 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDK 的 线程的经典使用

阅读更多

一、run()和start()


这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。


二、要害字Synchronized


这个要害字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。


public ThreadTest implements Runnable

{
public synchronized void run(){
for(int i=0;i<10;i )
{
System.out.println(" " i);
}
}
public static void main(String[] args)

{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}

}



以上这段程序中的 i 变量并不是共享数据,也就是这里的Synchronized要害字并未起作用。因为t1,t2两个线程是两个对象(r1,r2)的线程。不同的对象其数据是不同的,所以r1和r2两个对象的i变量是并不是共享数据。


当把代码改成如下:Synchronized要害字才会起作用

Runnable r = new ThreadTest();

Thread t1 = new Thread(r);

Thread t2 = new Thread(r);

t1.start();

t2.start();


三、sleep()


使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是假如有Synchronized同步块,其他线程仍然不同访问共享数据。注重该方法要捕捉异常


比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,假如没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。


总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。


四、join()


join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注重该方法也要捕捉异常。


五、yield()


它与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。


六、wait()和notify()、notifyAll()


这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized这个要害字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。


wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有

锁标志等待池中的线程能够获取锁标志;假如锁标志等待池中没有线程,则notify()不起作用。


notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

分享到:
评论

相关推荐

    jdk 1.5 线程的使用,简单例子

    通过接口java.util.concurrent.Callable 的使用 实现线程的启用,程序为一个main的例子,可以直接运行(jdk1.5 以上版本)

    jdk中线程安全的集合类.docx

    - **JDK 1.8及以后版本**:取消了分段锁的设计,改为使用更细粒度的锁——即每个链表或红黑树的头结点锁。此外,还引入了`CAS`和`synchronized`关键字来进一步提升性能。 ##### 2.3 初始化过程 `ConcurrentHashMap`...

    JDK21虚拟线程详解.pptx.pptx

    **JDK21虚拟线程简介** JDK21虚拟线程,又称为Project Loom的一部分,是Java语言中引入的一项创新技术,旨在改进并发处理的效率和简化异步编程模型。虚拟线程通过轻量级的协程实现,不再依赖于操作系统的原生线程。...

    JDK5中的多线程并发库.doc

    在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全性。这个库提供了丰富的类和接口,使得开发者能够更好地控制线程的执行、同步和通信。 1. **线程** - **线程与进程的关系**:...

    jdk1.5 线程并发与线程池的使用

    线程池(ThreadPool)是一种线程使用模式,它维护了一组可重用线程,当有新的任务提交时,线程池会从现有的线程中选择一个执行任务,而不是每次都创建新的线程。这样可以减少线程创建和销毁的开销,提高系统性能。在...

    JAVAJDK使用教程

    文档**,这部分可能涵盖如何在Android环境下使用JDK的特定部分,比如Java 8引入的Lambda表达式、Stream API在Android中的应用,或者如何处理多线程、网络编程等常见问题。 总的来说,这个教程涵盖了从基础到进阶的...

    JDK7多线程部分类(接口)关系图

    JDK7多线程部分类(接口)关系图,根据官网得出

    java jdk经典实例

    Java JDK经典实例是Java初学者不可或缺的学习资源,它包含了169个精心挑选的案例,覆盖了JDK中的大部分功能和细节。通过这些实例,学习者可以深入理解Java语言的核心特性,提升编程技能。以下是对这些知识点的详细...

    JDK5中的多线程并发库

    在JDK5中,多线程并发库引入了一系列新的特性,极大地增强了Java处理并发问题的能力。以下是关于这个主题的详细解释: 1. **线程**: - **线程与进程的关系**:进程是一个正在执行的程序实体,而线程是进程内部的...

    JDK5中的并发(多线程)

    JDK 5.0 是用 Java 语言创建高可伸缩的并发应用程序的主要步骤。JVM 已经进行了改进,允许类利用硬件级别支持并发,并且提供了一组丰富的新并发构造块,使开发并发应用程序更加容易。 &lt;br&gt;本教程将介绍 JDK 5.0 ...

    最常用和实用的JDK内存和线程监控指令

    最常用和实用的JDK内存和线程监控指令,堆栈监控指令及操作步骤

    jdk 内存设置jdk内存设置

    在 Windows Server 2003 系统上,使用 JDK5.0,最大可设置为 1478m。 在设置堆大小时,需要考虑多方面的因素,例如操作系统、物理内存、虚拟内存等。典型的堆大小设置为:-Xmx3550m -Xms3550m -Xmn2g -Xss128k。...

    旧版本JDK JDK1.4

    **Java Development Kit (JDK) 1.4:历史、特性与重要性** JDK(Java Development Kit)是Oracle公司发布的用于...尽管现在可能很少有人直接使用这个版本,但了解其特性对于深入学习Java技术和历史背景是很有价值的。

    jdk11的相关使用说明

    **Java JDK 11 使用详解** Java Development Kit (JDK) 是Java编程语言的核心组件,它包含Java编译器、Java运行环境、调试工具和其他必要的工具,使得开发者能够编写、测试和部署Java应用程序。JDK 11是Java的一个...

    windows64位jdk6、jdk7、jdk8安装包

    此外,JDK7还引入了Fork/Join框架,用于并行执行任务,提高了多线程程序的性能。 JDK8是Java平台标准版的第八个主要版本,于2014年发布,是Java发展历程中的一个里程碑。这个版本引入了Lambda表达式,使得函数式...

    jdk1.7免安装+jdk1.8安装版

    JDK1.7是在2012年发布的,引入了许多新特性,如动态类型语言支持(invokedynamic字节码指令),Project Coin的小型语言改进,Fork/Join框架以提升多线程性能,以及对NIO.2的增强,提供更好的文件系统访问能力。...

    jdk使用164个实例

    JDK使用164个实例,意味着这个压缩包可能包含了164个不同的Java编程示例,覆盖了JDK中各种类和接口的使用方法。这些实例对于学习和理解Java编程语言以及JDK中的核心功能非常有帮助。 首先,我们来讨论一下JDK中的...

    通用多线程模块(jdk线程池的运用)

    介绍一个通用多线程服务模块。是利用jdk线程池,多线程并行处理多任务,以提高执行效率。

    Java-jdk10-最新最全多线程编程实战指南-核心篇

    《Java-jdk10-最新最全多线程编程实战指南-核心篇》是一本深入探讨Java多线程编程的专著,针对Java 10版本进行了全面的更新和优化。这本书聚焦于Java多线程的核心概念和技术,旨在帮助开发者理解和掌握如何在并发...

Global site tag (gtag.js) - Google Analytics