`
勤业思行
  • 浏览: 83771 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

Java线程的终止和同步

    博客分类:
  • j2se
阅读更多

线程:是程序内部的顺序控制流。

Java线程:通过java.lang.Thread类来实现。

一、实现线程方法

1、新建一个Thread对象

2、新建一个Thread类的子类对象

3、新建一个实现Runnable接口的对象

二、Java VM的主线程:VM启动一个主线程(由public static void main(String[] args){}定义)。

多线程:在操作系统中同时运行几个线程(顺序流)。即程序运行期间多个进程(主方法、其他进程实现方法的实例对象)之间共享CPU。

三、线程的状态

1、创建:创建线程对象。

2、start:调用线程对象的该方法,则该线程进入就绪状态

3、就绪:就绪状态的线程,等待CPU的调度,调度后执行。

4、运行:就绪状态获取CPU资源,线程就可以执行

5、阻塞:阻塞事件发生触发线程从运行状态进入阻塞状态。当阻塞解除后线程进入就绪状态。阻塞事件例同步方法中调用this.wait()方法,阻塞当前锁定该对象的线程。阻塞解除事件如notify/notifyAll来唤醒wait进程。注wait方法在wait pool中不占用锁,唤醒后重新占用锁,而sleep在休眠时也占用锁。

6、终止:销毁线程。原来的JDK中使用stop方法来销毁线程。在JDK6中已经停用了改方法。现在一般处理方法是要终止线程,即线程的run方法运行完毕。可设置一个boolean flag属性来控制run方法的执行,当且仅当flag为true,run方法内部才执行。同时,可以定义一个shutDown方法来利用修改flag为false来终止线程的运行。

如:定义一个线程类

class TreadStop implements Runnable {

  private boolean flag=true; 

    public void run() {

      int i = 0;

     while (flag==true) {

          System.out.print("Thread of ThreadStop: " + i++);

                                }

                            }

      public void shutDown() {

           flag = false;

                                       }

}

 在调用该线程类的一个实例时:使用实例调用shutDown方法类终止线程

 

 

public class TestThreadStop{

  public static void main(String args[]){

    ThreadStop t = new ThreadStop();

      t.start();

       for(int i=0;i<100000;i++){

           if(i%10000==0 & i>0)

                 System.out.println("in thread main i=" + i);

        }

     System.out.println("Thread main is over");

      t.shutDown();

  }

}

 

四、线程状态控制方法:

 

方法名 控制说明
isAlive 线程是否启动并未终止
getPriority() 获取线程的调度优先级数值。优先级高的占用CPU时间片多。
setPriority() 设置线程的调度优先级数值。数值为1-10,默认为5。
Thread.sleep() 当前线程睡眠的毫秒数
join()

调用某个线程的该方法,将当前进程和该进程合并,直到该进程终止,再恢复当前进程的运行

相当于方法调用

yeild 让出CPU,进入就绪状态等待调度
wait 进入对象的wait pool
notify/notifyAll 唤醒对象的wait pool的一个或全部线程

注;wait和sleep的区别:

wait是别的线程可以访问锁定对象,且调用wait方法时必须锁定该对象。而sleep时别的线程也不可以访问锁定对象。

五、线程同步

    在Java中,用对象互斥锁来保证共享数据的完整性。每个对象都对应一个“互斥锁”标记。这个标记保证在任意时刻,只有一个线程在访问该对象。Java中,互斥锁标记用Synchronized关键字来说明。当某个对象用Synchronized修饰时表示任一时刻只有一个线程可以访问该对象,这样保证了数据的完整性。同样,Synchronized可以用于修饰方法,说明该方法是同步方法(方法执行时当前对象被锁定)。

synchronized (this){ //执行语句块时当前对象被锁定 }

同理同步方法为:

public synchronized void methodName(){ //执行该方法时当前对象被锁定 }

 否则,在多个线程运行时不能保证原来一个语句块的原子性:

例:我们希望在add方法中输出该方法是被第几次访问。

public static int num=0;

public void add(){

   num++;

   System.out.println("这是第 "+num+"次调用该方法");

}

在进程1中:在num++;和System.out.println();之间若没有锁定当前对象的话,其他进程(进程2)打断当前进程(进程1)的执行,执行了add方法中的num++,此时num值为2。然后回到原来的进程1 执行,输出进程1是第2次调用该方法。然后回到进程2,输出这是第二次调用该方法。这就导致执行结果和我们预期的不一致。

这就是为什么要用synchronized关键字来锁定当前对象。若锁定在方法add中当前对象或使用synchronized(this){}将要原子执行的语句放在花括号中也可以。

之所以上面问题的解决方案可有:

1、用synchronized(this){}锁定当前对象

public void add(){

  synchronized(this){

    num++;

    System.out.println("这是第 "+num+"次调用该方法");

   }

}

2、用synchronized关键字修饰add方法使在add方法内锁定当前对象

public synchronized void add(){
    num++;
    System.out.println("这是第 "+num+"次调用该方法");
}

 

注:当一个线程类中有同步方法和非同步方法时,要仔细考虑可以访问关注对象的所有方法是否加锁。对于同步方法,只能有一个线程独占执行完成后释放。而非同步方法,可以由多个线程交叉访问。

对于一个对象,我们对对象"写"的方法需要设置为同步方法,这是因为多个同步方法都要锁定对象,所以,只有一个线程在一段时间内"写"该对象。"读"方法可以不用设置为同步(效率高)。 

分享到:
评论

相关推荐

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    java 线程工具类 java 线程工具类

    java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具...

    Java线程状态流转图

    该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java线程的生命周期中,NEW是最初始的状态。在这个状态下,线程对象已经创建,但尚未启动。只有...

    java线程实例 各种小Demo

    在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台服务。 一、线程的创建方式 Java提供了多种创建线程的方式: 1. 继承Thread类:创建一个新的类,继承...

    Java线程.ppt

    线程调度和控制包括对线程的启动、暂停、恢复和终止。`start()`方法启动线程,`sleep()`方法让线程进入堵塞状态,`join()`方法等待线程执行完成,`yield()`方法让当前线程让出CPU,`stop()`方法停止线程(不推荐使用...

    Java线程详解大全

    Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...

    JAVA线程学习(源代码)

    在Java编程语言中,线程是程序执行的基本单元,它允许程序同时执行多个任务。Java提供了丰富的线程API,使得开发者能够轻松地创建、管理和控制线程。本资源"JAVA线程学习(源代码)"提供了关于Java线程的源代码示例,...

    java 线程相关工具类

    java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类....

    Java线程(第三版)

    《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...

    java线程分析工具TDA

    Java线程分析是Java开发中的重要环节,尤其是在处理性能优化、死锁排查或者并发问题时。TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的...

    JAVA线程dump的分析

    JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows...

    java线程入门级书籍

    - **死亡状态**:线程执行完毕或被异常终止后,进入死亡状态。 #### 六、线程间通信 线程间通信是指线程之间传递消息或数据的过程,主要包括以下几种方式: - **wait()和notify()方法**:这两个方法用于控制线程...

    java多线程Demo

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

    java线程与并发编程实践

    线程的生命周期包括新建、就绪、运行、阻塞和终止五种状态,Java API提供了start()、sleep()、join()、yield()、interrupt()等方法来控制线程状态。 并发编程的核心挑战在于线程间的同步与通信。Java提供了一系列...

    java线程深入解析

    Java线程是Java编程语言中的核心概念,尤其在多任务处理和并发编程中扮演着重要角色。线程允许一个程序内部同时执行多个独立的控制流,使得程序能够更高效地利用处理器资源。本文将深入解析Java线程的相关知识点,...

    java线程.rar

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,线程是通过类`Thread`或实现`Runnable`接口来创建和管理的。Java线程模型是基于操作系统的原生...

    电子书《java线程》

    线程的生命周期包括新建、就绪、运行、阻塞和终止等状态,理解这些状态以及如何在这些状态之间转换是理解和使用Java线程的基础。 书中可能涵盖了以下几个关键知识点: 1. **线程的创建与启动**:通过创建Thread...

    java线程状态转换图

    本文将详细介绍 Java 线程状态转换图,包括初始状态、可运行状态、运行状态、阻塞状态、锁池状态、等待队列状态和终止状态七种状态的定义、特点和转换关系。 初始状态(Newborn) * 线程的实现有两种方式,一是...

    Java线程如何终止.pdf

    本文主要讨论了三种常见的Java线程终止方法:使用退出标志、使用`stop`方法(不推荐)以及使用`interrupt`方法。 1. **使用退出标志终止线程** 这是最常见且推荐的方法。在`run`方法内部,通常会有一个循环来保持...

Global site tag (gtag.js) - Google Analytics