第二篇:线程七种状态

线程状态

  • 初始化状态
  • 就绪状态
  • 运行状态
  • 死亡状态
  • 阻塞状态
  • 超时等待
  • 等待状态

1.1 初始化状态

通过实现Runnable接口,new出来实例,线程进入初始化状态

1.2 就绪状态

初始化状态调用start()方法,程序进入了就绪状态。

①调用start(),sleep()结束,join()方法结束,调用yield()方法。

②某个线程拿到对象锁,锁池里的对象拿到对象锁。

③当前时间片用完。

1.3 运行状态

线程抢占到CPU资源。

1.4 死亡状态

线程正常执行完、调用stop()方法、抛出异常或ERROR。

1.5 阻塞状态

发生I/O输入,进入同步代码块

1.6 超时等待

执行Thread.sleep()方法,此方法是Thread内的方法,会抛出异常。

1.7 等待状态

调用Object里的wait()方法。

比较点 wait() sleep()
所属类 Thread Object
控制资源 释放资源,让出CPU 不释放资源,仅仅让出CPU
方法结束时刻 调用notify()或notifyAll() 超时时间到
调用方法后线程状态  线程释放对象锁,进入等待锁池 指定时间不运行
方法调用结束后
等待notify()、或者notifyAll()同步方法执行完拿到锁,

进入就绪状态

方法调用结束,进入就绪状态

1.7 线程状态的切换

 线程状态切换中的方法说明

  1. start():调用start()方法会使得该线程开始执行,正确启动线程的方式。
  2. wait():调用wait()方法,进入等待状态,释放资源,让出CPU。需要在同步快中调用。
  3. sleep():调用sleep()方法,进入超时等待,不释放资源,让出CPU
  4. stop():调用sleep()方法,线程停止,线程不安全,不释放锁导致死锁,过时。
  5. join():调用sleep()方法,线程是同步,它可以使得线程之间的并行执行变为串行执行。
  6. yield():暂停当前正在执行的线程对象,并执行其他线程,让出CPU资源可能立刻获得资源执行。
    yield()的目的是让相同优先级的线程之间能适当的轮转执行
  7. notify():在锁池随机唤醒一个线程。需要在同步快中调用。
  8. nnotifyAll():唤醒锁池里所有的线程。需要在同步快中调用。

 线程状态方法测试

/**
 * 测试yield()
 */
public class TestYield {
	public static void main(String[] args) {
		MyThread t1 = new MyThread("t1");
		MyThread t2 = new MyThread("t2");
		t1.start();
		t2.start();
	}
}

class MyThread extends Thread {
	MyThread(String s) {
		super(s);
	}

	public void run() {
		for (int i = 1; i <= 100; i++) {
			System.out.println(getName() + ":" + i);
			if (i == 0)
				yield();
		}
	}
}
t1:1
t2:1 ---t2执行
t1:2
t1:3
t1:4
t2:2

  

join()问题连接
/**
 * 测试join()
 */
public class JoinTest {
    public static void main(String [] args) throws InterruptedException {
        ThreadJoinTest t1 = new ThreadJoinTest("t1");
        ThreadJoinTest t2 = new ThreadJoinTest("t2");
        t1.start();
        t1.join();
        t2.start();
    }

}
class ThreadJoinTest extends Thread{
    public ThreadJoinTest(String name){
        super(name);
    }
    @Override
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println(this.getName() + ":" + i);
        }
    }
}
t1:9
t2:0  --t1执行完,t2才执行
t2:1
t2:2
t2:3
t2:4

join()可以带参数:join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。join()必须在start()后,这样才能同步。

  

原文地址:https://www.cnblogs.com/dc-earl/p/9594162.html

时间: 2024-08-02 11:51:59

第二篇:线程七种状态的相关文章

java并发相关(四)—— 线程的七种状态

我们知道线程一共有七种状态,之间转换如下图: 锁池与等待池 原文地址:https://www.cnblogs.com/fbw-gxy/p/11689566.html

java线程五种状态

java线程五种状态: 创建 -> 就绪 -> 运行 -> 销毁 创建 -> 就绪 -> 运行 -> 等待(缺少资源) -> 销毁 下图:各种状态转换

线程几种状态的转变

线程在一定条件下,状态会发生变化.线程一共有以下几种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于"可运行线程池"中,变得可运行,只等待获取CPU的使用权.即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得. 3.运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权

java线程四种状态

一个线程可以有四种状态: 1.新(new), 即线程刚刚创建,而并未执行 2.可运行(runnable),意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行.因此,线程可能在.也可能不在运行当中,但一旦条件许可,没有什么能阻止它的运行——它既没有“死”掉,也未被“堵塞”. 3.Dead,从自己的run()方法中返回后,一个线程便已“死”掉.亦可调用 stop()令其死掉,但会产生一个违例——属于Error的一个子类(也就是说,我们通常不捕获它).记住一个违例的“掷”

线程5种状态

来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=396GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com 线程的5种状态 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权. 3.运行状态(Running):就绪状态的线程获取了CP

线程5种状态-详细

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=400 线程从创建.运行到结束总是处于下面五个状态之一:新建状态.就绪状态.运行状态.阻塞状态及死亡状态.1.新建状态(New): 当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线程

11.4-全栈Java笔记:线程三种状态的控制

关于Java线程终止.暂停.联合的文章网上有很多,经过测试,本节重点讲解的是针对不同使用场景选择合适的方法. 终止线程的典型方式 终止线程我们一般不使用JDK提供的stop()/destroy()方法(他们本身也被JDK废弃了).通常的做法是提供一个boolean型的终止变量,当这个变量置为false,则终止线程的运行. [示例1]终止线程的典型方法(重要!!!) public class TestThreadCiycle implements   Runnable { String name;

【Python之旅】第二篇(七):集合

说明: ·类似于数学中学的集合,Python中的集合可以实现去重的功能,通过set()函数来实现: ·sets支持x in set, len(set)和 for x in set: ·作为一个无序的集合,sets 不记录元素位置或者插入点,因此,sets不支持indexing, slicing,或其它类序列(sequence-like)的操作: ·学习集合,主要是学习集合的一系列标准操作:集合创建.集合添加.集合删除.交并差集等: 1.创建集合:set() >>> a = range(1

iOS开发多线程篇—线程的状态

iOS开发多线程篇—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时