闲聊Java中的线程声明周期及常用方法

一、线程的生命周期

1)初始状态

此时线程处于JVM的进程中,只是创建了一个线程对象,并没有开始运行(new())。

2)就绪状态(可运行状态)

此时线程进入可运行状态,等待CPU调度(start())。

3)运行状态

拥有CPU的执行权,并且开始运行线程(run())。

4)阻塞状态

线程在等待IO或者调用了sleep()或join()等方法会导致线程进入阻塞状态,从阻塞状态出来的线程不一定马上回到运行状态,而是回到可运行状态等待CPU的再次调度(blocked)。

5)等待队列状态(加锁的基本上都是针对对象---在堆内存中)

一个线程在某个对象上调用wait()方法会放弃该对象的锁并进入等待队列状态,只有当另一线程调用临界资源的notify()或者notifyAll()才会将等待队列中的线程释放,进入锁池状态(waiting)。

6)锁定状态

多线程中每个对象都有互斥锁标记,如果一个线程想访问一个对象,而该对象的锁标记已被另一线程占用,则该线程进入锁池状态。从锁池状态出来的线程回到可运行状态,等待CPU调度(blocked)。

7)终止状态

一个线程运行结束后称为终止状态,也叫死亡状态一个进程只有所有的线程退出后才能终止(dead)。

状态转换图如下:

二、常用方法

  线程操作

    currentThread()   返回对当前正在执行的线程对象

    run()    线程体内执行的代码应该都放在run方法里,用户不应该直接调用run()方法

    start()    使该线程开始执行并调用该线程的run方法

    yield()    暂停当前正在执行的线程对象,并执行其他线程

    sleep()    在指定的毫秒数内让当前正在执行的线程休眠

    join()    等待该线程终止

    interrupt()   中断线程

  线程测试

    isAlive()   测试线程是否处于活动状态

    isInterrupted()   测试线程是否已经中断

    isDaemon()   测试该线程是否为守护线程

  线程属性

    setName()   改变该线程的名称

    getName()   返回该线程的名称

    setPriority()   更改线程的优先级

    getPriority()   返回线程的优先级

    setDaemon()   将该线程标记为守护线程或用户线程

1)每一个java程序都有一个默认的主线程,即main()函数。

public class ThreadDemo {  
    public static void main(String[] args) {  
        Thread thr = new Thread(new MyThread());
        System.out.println("初始状态完成");
        thr.start();
        System.out.println("就绪状态完成");
        int j = 0;  
        while (j++ < 10) {  
            System.out.println("当前线程的名字是: " + Thread.currentThread().getName() + "-" + j);  
            try {
            	System.out.println("main 中阻塞状态 ");
                Thread.sleep(1000);  
            } catch (InterruptedException e) {  
            }  
        }  
    }  
}  
  
class MyThread implements Runnable {  
    @Override  
    public void run() {
    	System.out.println("运行状态");
        int i = 0;  
        while (i++ < 10) {  
            System.out.println("当前线程的名字是: " + Thread.currentThread().getName() + "..." + i);
            try {  
            	System.out.println("run 中阻塞状态 ");
                Thread.sleep(1000);
            } catch (InterruptedException e) {  
            }  
        }  
    }  
}

运行结果:main线程和Thread-0线程不规则交替执行,各自每隔1s输出信息直到结束。

2)调用join方法会在当前线程内等待某一线程终止,join方法内部调用了Object的wait()方法。

public class ThreadDemo {
	public static void main(String[] args) {
		Thread thr = new Thread(new MyThread());
		thr.start();
		try {
			thr.join();//会让main线程等待thr线程执行完,main线程再执行,抢占式
		} catch (InterruptedException e) {
		}
		int j = 0;
		while (j++ < 100) {
			System.out.println(Thread.currentThread().getName() + "..." + j);
		}
	}
}

class MyThread implements Runnable {
	@Override
	public void run() {
		int i = 0;
		while (i++ < 100) {
			System.out.println(Thread.currentThread().getName() + "..." + i);
		}
	}
}

运行结果:Thread-0线程全部输出完毕,main线程才继续执行。

3)调用interrupt()方法可以使得处于阻塞状态的线程抛出一个异常,不会中断正在运行的程序。

public class ThreadDemo {
	public static void main(String[] args) {
		Thread thr = new Thread(new MyThread());
		thr.start();
		try {
			Thread.sleep(1000);//main线程休眠1秒,处于阻塞状态
		} catch (InterruptedException e) {
		}
		thr.interrupt();//会使main线程抛出一个InterruptedException,而自身不会中断
	}
}

class MyThread implements Runnable {
	@Override
	public void run() {
		int i = 0;
		while (i++ < Integer.MAX_VALUE) {
			System.out.println(Thread.currentThread().getName() + "..." + i);
		}
	}
}

运行结果:thr会一直运行,但调用interrupt()会将中断标志位(isInterrupted())置为true,因此可以通过判断标志位来中断线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值