`
Swifly
  • 浏览: 14044 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

九、Java多线程机制

阅读更多
1. 线程的基本概念
    线程是一个程序内部的顺序控制流。
    线程的状态 (创建 / 就绪 / 运行 / 阻塞 / 中止)
    线程和进程的区别
引用
每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
线程可以看成时轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
多进程: 在操作系统中能同时运行多个任务(程序)
多线程: 在同一应用程序中有多个顺序流同时执行

    Java的线程是通过java.lang.Thread类来实现的。
     VM 启动时会有一个由主方法(public static void main() {})所定义的线程。
     可以通过创建 Thread 的实例来创建新的线程。
     每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
     通过调用Thead类的start()方法来启动一个线程。
2. 线程的创建和启动
引用
可以有两种方式创建新的线程。
第一种
    定义线程类实现Runnable接口
    Thread myThread = new Thead(target)//target为Runnable接口类型。
    Runnable中只有一个方法:
    public void run(); 用以定义线程运行体。
    使用Runnable接口可以为多个线程提供共享的数据。
    在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:
    public static Thread currentThread()  获取当前线程的引用。
第二种
    可以定义一个Thread的子类并重写其run方法如:
      class MyThread extends Thead {
           public void run(){…}
       }
然后生成该类的对象:
MyThread myThread=new MyThead(…)

3. 线程控制基本方法
isAlive() 判断线程是否还“活”着,即线程是否还未终止。
getPriority() 获得线程的优先级数值
setPriority() 设置线程的优先级数值
Thread.sleep() 将当前线程睡眠指定毫秒数
join() 调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行。
yield() 让出CPU,当前线程进入就绪队列等待调度。
wait() 当前线程进入对象的wait pool。
notify()/notifyAll() 唤醒对象的wait pool中的一个/所有等待线程。

4. sleep / join / yield 方法
引用
sleep方法
    可以调用Thread的静态方法:
      public static void sleep(long millis) throws InterruptedException
  使得当前线程休眠(暂时停止执行millis毫秒)。
    由于是静态方法,sleep可以由类名直接调用:
         Thread.sleep(…)
join方法
    合并某个线程
yield方法
    让出CPU,给其他线程执行的机会

5. 线程模式
    两种线程模式:
    协作式:一个线程保留对处理器的控制直到它自己决定放弃
        速度快、代价低
        用户编程非常麻烦
    抢先式。系统可以任意的从线程中夺回对CPU的控制权,再把控制权分给其它的线程 。
        两次切换之间的时间间隔就叫做时间片
        效率不如协作式高 ,OS核心必须负责管理线程
        简化编程,而且使程序更加可靠
    多数线程的调度是抢先式的。
6. 线程的优先级别
    Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。
    线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5。
         Thread.MIN_PRIORITY = 1
        Thread.MAX_PRIORITY = 10
        Thread.NORM_PRIORITY = 5
    使用下述线方法获得或设置线程对象的优先级。
         int getPriority();
        void setPriority(int newPriority);
    不同平台上的优先级
        Solaris:相同优先级的线程不能相互抢占对方的cpu时间。
        windows:可以抢占相同甚至更高优先级的线程的cpu时间
7. 线程同步
 在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问该对象。
 关键字synchronized 来与对象的互斥锁联系。当某个对象synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
 通常情况下(不包括调用了wait方法),只有synchronized修饰的代码全执行完,才会释放这把锁。
 synchronized可以修饰
 修饰非静态的成员方法,或者方法里面的一部分代码
 修饰参数
 修饰成员变量
 修饰static方法,那么锁加到了Test.class上。
 修饰类
 如果调用没有被synchronized修饰的普通方法,由于不需要得到一把锁。所以肯定不需要排队
 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
 定义private 的成员变量,所有访问到关键成员变量的方法都要认真考虑是不是同步。
public class Test implements Runnable {
  Timer timer = new Timer();
  public static void main(String[] args) {
    Test test = new Test();
    Thread t1 = new Thread(test);
    Thread t2 = new Thread(test);
    t1.setName("t1"); t2.setName("t2");
    t1.start(); t2.start();
  }
  public void run(){
    timer.add(Thread.currentThread().getName());
  }
}
class Timer{
  private static int num = 0;
  public void add(String name){
    num ++;
    try {Thread.sleep(1);} 
    catch (InterruptedException e) {}
    System.out.println(name+", 你是第"+num+"个使用timer的线程");
  }
}

8. wait sleep 区别
引用
来源不同
 Sleep是Thread提供的方法
 Wait继承自Object
 代码位置不同
 Wait需要写在Synchronize语句块里面
 是否释放锁定对象
 调用wait方法,释放锁定该对象
 Sleep时别的线程也不可以访问锁定对象

9. Synchronized总结
引用
无论synchronized关键字加在方法上还是对象上,它取得的锁都是锁在了对象上,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
每个对象只有一个锁(lock)与之相关联。
实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。
还有一些技巧可以让我们对共享资源的同步访问更加安全:
定义private 的instance变量+它的 get方法,而不要定义public/protected的instance变量。如果将变量定义为public,对象在外界可以绕过同步方法的控制而直接取得它,并改动它。
如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。 这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。
分享到:
评论

相关推荐

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    java多线程机制 详解

    Java的多线程机制是Java语言的一大特性,它允许程序同时执行多个任务,提升程序响应速度,优化资源利用率。在Java中,线程是程序执行的最小单位,一个进程可以包含多个线程,每个线程都有自己独立的生命周期,包括...

    Java多线程机制研究

    Java多线程机制研究.kdh Java多线程机制研究.kdh Java多线程机制研究.kdh

    Java多线程机制(示例)

    ### Java多线程机制详解与示例 #### 一、Java多线程机制概述 Java中的多线程机制是程序设计中的一个重要概念,它允许在同一个应用程序中并发执行多个线程,有效地提高了程序的执行效率和响应速度。通过Java语言...

    JAVA多线程练习题答案。

    JAVA多线程练习题答案详解 在本文中,我们将对 JAVA 多线程练习题的答案进行详细的解释和分析。这些题目涵盖了 JAVA 多线程编程的基本概念和技术,包括线程的生命周期、线程同步、线程状态、线程优先级、线程安全等...

    利用Java多线程机制实现带滚动字幕的时钟

    当用户在“命令”后的文本框中输入“start clock”后,“现在的时间是”后的文本框开始显示系统时钟;当用户输入“stop clock”后,时钟终止显示。 (2)当用户在“命令”后的文本框中输入“fast”后,能够加速滚动...

    java多线程详解(比较详细的阐述了多线程机制)

    本文将深入探讨Java多线程机制,包括线程的创建、同步、通信以及常见设计模式。 首先,Java中创建线程主要有两种方式:通过实现Runnable接口和继承Thread类。实现Runnable接口更灵活,因为Java是单继承的,而通过...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。...在实际开发中,正确地应用多线程机制可以显著提升程序的性能和用户体验。

    Java的多线程机制分析与应用.pdf

    "Java多线程机制分析与应用" Java多线程机制是Java语言中一个重要的特征,可以通过对Java中的多线程创建机制和使用方法进行探讨,分析多线程中的同步必要性和实现方式,并给出多线程的实际应用示例。 Java多线程...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    JAVA多线程机制

    Java多线程机制是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。本文...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程进度条

    本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    基于Java多线程机制的探析

    ### 基于Java多线程机制的探析 #### 摘要 本文深入探讨了Java多线程机制的基本原理及其应用场景。首先简要分析了Java多线程的概念及其实现方法,随后详细介绍了多线程在多用户远程协同工作系统中的应用,特别是...

    关于Java多线程机制的探讨.pdf

    "Java多线程机制探讨" Java多线程机制是指在Java语言中实现多线程编程的机制。多线程机制允许多个线程同时执行,提高了程序的效率和响应速度。Java多线程机制可以通过Thread类或Runnable接口实现。 Thread类是Java...

    java多线程分页查询

    ### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...

    析Java多线程机制.pdf

    "Java多线程机制详解" Java多线程机制是Java语言中的一种重要机制,能够提高程序的执行效率。本文将介绍Java语言中多线程的两种实现方式,并分别举例说明了各自的特点、格式以及运行结果。 第一种实现方式是实现...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

Global site tag (gtag.js) - Google Analytics