• Tags
  •         
  • www.breakyizhan.com
  •    

    这篇文章主要说的是Java并发编程的原理与实战,之线程状态以及各个线程状态的关系

    JAVA多线程的执行过程

    一个关于线程状态的这么一个问题,那么我们之前已经了解过了,就是说那个被创建出来之后,它并不是会立刻执行,而是由多个线程进行抢占cpu资源,那么哪一个线程抢占到了CPU,就由哪个线程来执行。关于这个问题,可以想一想,很多个线程围在CPU周围,上边有多个任务再转,那么转了哪个?就由哪个线程来执行。

    Java线程的生命周期问题

    Java线程状态以及各个线程状态的关系

    那么也就是说在这个过程中,涉及到一个这个现场的生命周期的问题,就是说从线程的创建到线程的销毁这个过程,他所经历的这个啊各个阶段,那么我们总结一个就是线程的状态,那么可以说,这个线程呢一共有这个从创建到啊死亡,可以说是有这个七个状态。

    首先第一个呢我们把它称之为这个啊实例化,也就是所谓的初始化状态。那么当它调用了这是我们的初始化状态,啊这是我们的初始化状态。

    那么初始化状态就是调用了start的方法,我们知道时他的方法是启动一个线程,那么就变成了ready run。ready run不是run,而是一个准备运行状态,对不对?它也就是一个处于就绪状态。由就绪状态我们发现,如果他当一旦抢占到了cpu资源,就变成了运行状态,那么这就是运行中状态。

    那么当它运行完毕之后,正常的就结束了,那么就到了Dead状态。也就所谓的死亡阶段。

    那么这就是一个整完整的生命周期。那么但是在这个过程中,我们知道会像人的一生一样,就是总会遇到很多的磨难。比如说在那个准备就绪的阶段,突然遇到了这个stop(),这个夭折了,于是就死了,对不对?或者通过这个啊就是Top那么这个运行完成,呢他也会去进运行完成,就说我们这个过程就已经这个是正常结束了,就说如果遇到了stop,调用了这个stop方法,那么它就结束了。那么当我们这个运行的时候,就准备运行的时候,如果调用知道不就挂了,那么运行的运行的运行,呢突然调用了一个司令部方法,于是就睡觉了,或者调用了一个wait,于是就到了等待状态,啊嗯或者呢就是说这个遇到IO的话就阻塞了,那么这上边有两个这个嗯状态,啊分别是这个sleeping和那个wait,那么我们可以怎么理解?

    我们可以把这个sleeping它其实也是一种等待,对不对?它呢它是一种超时等待,那么这个超时等待,呢就是说当一定时间过了之后,它就能自己再回到我们的这个热力图上去进行这个竞争cpu资源。

    而这个waiting,我们就认为他是一个等待状态。那么如果没有人唤醒它,它将一直等待下去,必须要有人通过这个notify或者notifyAll来进行唤醒。

    就是说你其实用sleeping可以设定它的这个超时等待时间,那么当他的时间到了之后,那么它就会自动的去进入到就绪状态,去竞争这个cpu的资源,
    还有一个阻塞状态blocked阻塞状态,blocked阻塞状态要当那个数据获取到了,那么他就不再阻塞到这个IO上了,于是就进入了这个执行状态。当然了它这个在这个阻塞过程中也有可能会直接进入到这个终止状态。那么有等待状态或者超市等待状态,blocked阻塞状态是不会直接进入到终止状态上,它只可能从这个运行状态进入到他们。这就是整个线程的整个生命周期。

    Java线程状态以及各个线程状态的代码示例

    下面我们就来这个通过代码来演示一下我们这个整个线程的这个生命周期

    package com.breakyizhan.thread.t1;
    
    public class NewThread implements Runnable {
    
    	@Override
    	public synchronized void run() {
    		while(true) {
    			try {
    				wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			System.out.println(这是自定义的字线程执行了....);
    		}
    	}
    	
    	public static void main(String[] args) {
    		
    		NewThread n = new NewThread();
    		
    		// 初始化状态
    		Thread thread = new Thread(n); // 创建线程,并指定线程任务
    		thread.start(); // 启动线程	
    		while(true) {
    			synchronized (n) {
    				System.out.println(这是自定义的主线程执行了...);
    				try {
    					Thread.sleep(100);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				n.notifyAll();
    			}
    			
    		}
    		
    	}
    
    }
    
    

     
    转载请保留页面地址:https://www.breakyizhan.com/java/6611.html