`
reb12345reb
  • 浏览: 50280 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 线程状态切换

阅读更多

 

 

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

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

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

2.join()

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

3.yield()

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

4.wait()和notify()、notifyAll()

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

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

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

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

注意 这三个方法都是java.lang.Ojbect的方法!

------------
再添两天比较熟悉的:

2.run()和start()


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


2.关键字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();
---------------
JAVA线程的四种状态

线程有四种状态,任何一个线程肯定处于这四种状态中的一种:

1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。

2) 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的start()方法后,线程就处于可执行状态,但显而易见的是此时线程不一定正在执行中。

3) 死亡(Dead):当一个线程正常结束,它便处于死亡状态。如一个线程的run()函数执行完毕后线程就进入死亡状态。

4) 停滞(Blocked):当一个线程处于停滞状态时,系统排程器就会忽略它,不对它进行排程。当处于停滞状态的线程重新回到可执行状态时,它有可能重新执行。如通过对一个线程调用wait()函数后,线程就进入停滞状态,只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态。

分享到:
评论

相关推荐

    Java线程状态及切换、关闭线程的正确姿势分享

    "Java线程状态及切换、关闭线程的正确姿势分享" 本文将详细介绍Java线程状态及切换、关闭线程的相关内容。线程状态及切换是Java多线程编程中一个非常重要的概念,掌握线程状态及切换是编写高效、稳定、可靠的多线程...

    Java线程.ppt

    学习Java线程,理解其创建、状态转换、调度和控制,以及如何处理线程间的互斥和同步,对于开发高效、稳定的并发程序至关重要。通过深入研究这些概念,开发者能够编写出更符合现代计算需求的高质量软件。

    JAVA单线程多线程

    3. **资源消耗少**:单线程程序创建和切换线程的开销较小,对于资源有限的环境更为友好。 然而,单线程也有其局限性: 1. **性能瓶颈**:在多核处理器环境下,单线程程序无法充分利用硬件资源,可能会导致性能瓶颈...

    Java线程详解.ppt

    Java线程是并发编程的核心部分,它允许程序在同一时间执行多个任务,从而提高了系统的效率和资源利用率。在Java中,线程是通过`Thread`类或者实现`Runnable`接口来创建和管理的。 首先,我们要理解进程和线程的概念...

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

    线程代表了程序中的执行流,可以在不同的线程之间切换以共享CPU时间。线程的状态包括新建、运行、中断和死亡。线程的生命周期始于新建,通过调用start()方法进入就绪状态,然后可能进入运行、阻塞或等待,最后在run...

    Java多线程编程经验

    #### 五、Java线程:线程状态的转换 线程的状态主要有:新状态(New)、可运行状态(Runnable)、阻塞状态(Blocked)、等待状态(Waiting)、定时等待状态(Timed Waiting)以及终止状态(Terminated)。这些状态...

    java线程与协程效果对比

    总的来说,Java线程适合CPU密集型任务,能充分利用硬件资源,但面临上下文切换和同步问题;而协程则在IO密集型任务中表现出色,拥有更高的并发性和更低的开销。开发者应根据具体应用场景选择合适的并发模型,以优化...

    JAVA 线程中启动线程

    2. **线程状态** - **新建(New)**:线程对象已经创建,但尚未调用`start()`方法。 - **可运行(Runnable)**:`start()`方法已调用,线程可能正在执行也可能等待CPU资源。 - **运行(Running)**:线程获取到...

    第15讲 Java多线程.ppt

    创建和启动Java线程: * 可以使用extends Thread方法创建线程。 * 可以使用Runnable接口创建线程。 线程的状态和线程控制: * 线程的状态包括新建、可运行、阻塞、等待、死亡等。 * 线程控制包括线程的启动、暂停...

    JAVA线程上下文切换.docx

    Java线程上下文切换是并发编程中的一个重要概念,它涉及到多线程环境下CPU时间片分配、任务状态保存与恢复以及由此带来的性能影响。上下文切换是操作系统为了实现多任务并发执行而采取的一种策略,即使得在单核CPU上...

    JAVA多线程教材

    4. **线程优先级与守护线程**:Java线程有优先级之分,可以影响调度,但实际效果取决于操作系统。守护线程(Daemon Thread)是一种特殊类型的线程,当它是系统中唯一运行的线程时,JVM会自动退出。 5. **并发集合与...

    JAVA线程高级-线程按序交替执行

    - `Thread.yield()`方法使当前线程让出CPU,但不保证一定会切换到其他线程,而是由操作系统决定。 在实际编程中,我们需要根据具体需求选择合适的同步机制,合理控制线程的执行顺序,确保程序的正确性和性能。通过...

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    这一过程涉及到操作系统内核级别的线程状态切换,使得线程从可运行状态变为等待状态,直到指定的时间过去。一旦时间结束,线程状态会再次转变为RUNNABLE,等待操作系统调度器重新调度其运行。 同时,这些状态切换的...

    java线程入门 Java线程编程很好的入门书

    三、线程状态 4. 线程生命周期:线程有五种状态——新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。 5. 线程调度:Java使用抢占式调度,优先级高的线程获得CPU执行权,但...

    java线程入门,一本简绍java线程的书

    2. **线程的状态**:包括新建、就绪、运行、阻塞和终止五种状态,以及线程状态之间的转换。 3. **线程的启动与停止**:使用`start()`方法启动线程,理解线程的生命周期,以及如何通过`join()`、`interrupt()`等方法...

    Java线程 高级使用

    - **线程状态**:Java线程有六种状态:NEW(新建)、RUNNABLE(可运行)、BLOCKED(阻塞)、WAITING(等待)、TIMED_WAITING(定时等待)、TERMINATED(终止)。 - **线程同步机制**:为了防止多线程环境下的数据...

    Java线程书

    ### Java线程基础知识详解 #### 一、引言 随着计算机技术的发展,多核处理器已经成为了标配,这为多线程编程提供了强大的硬件支持。Java作为一种广泛应用的编程语言,在其设计之初便内置了对线程的支持,使得...

    java多线程课件

    线程的并发执行使得在单核CPU上模拟出多任务处理的效果,通过操作系统快速地在不同线程间切换,给人一种同时执行的感觉。 线程与进程的主要区别在于,线程的划分尺度小于进程,创建和销毁线程的开销较小,且多个...

    Java线程的6种状态及切换(透彻讲解).docx

    Java线程的状态管理和转换是多线程编程中的关键概念,对于理解和优化并发应用程序至关重要。Java中的线程有六种状态,分别是: 1. **初始(NEW)**:当使用`new`关键字创建一个新的线程对象,但尚未调用`start()`方法...

    java线程.pdf

    1. **线程生命周期**:Java线程具有不同的生命周期状态,包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)等状态。 2. **线程优先级**:每个线程都有一个优先级,这决定了...

Global site tag (gtag.js) - Google Analytics