Java基础-线程状态和方法
1、线程状态
一、初始状态
- 实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态。Thread t = new Thread();
二.可运行状态-就绪状态
- 可运行状态只是说你资格运行,调度程序没有挑选到你,你就永远是可运行状态。线程在线程队中进行排队,等待CPU的服务。
- 调用线程的start()方法,此线程进入可运行状态。
- 当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入可运行状态。
- 当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入可运行状态。
- 锁池里的线程拿到对象锁后,进入可运行状态。
三.运行状态
- 线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。
- 获取CPU的资源,run()方法
四.死亡状态
- 当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。
- 在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
- 或者是stop();情况下,此时线程无运行能力。
五.阻塞状态
- 当前线程T调用Thread.sleep()方法,当前线程进入阻塞状态。
- 运行在当前线程里的其它线程t2调用join()方法,当前线程进入阻塞状态。
- 等待用户输入的时候,当前线程进入阻塞状态。
- 执行的线程被挂起,或者耗时的输入和输出操作,使得cpu暂时终止执行该任务,阻塞的任务不能排队,当阻塞原因被排除的时候,线程才能就绪。
2、线程常用方法
1)getName(): 获取线程名称
public void run(){
for(int i=0;i<10;i++){
Thread t = new Thread();//获取当前线程名称
System.out.println(t.getName()+":"+i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo1 d1 = new Demo1();
new Thread(d1,"xian").start();
new Thread(d1).start();
new Thread(d1).start();
}
2)isAlive()是否为活动状态
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
Thread t = new Thread();//获取当前线程名称
System.out.println(t.getName()+":"+i);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo2 d2 = new Demo2();
Thread t1 = new Thread(d2);
System.out.println("线程是否活动"+t1.isAlive());//start()之后才是活动状态-false
t1.start();
System.out.println("线程是否活动"+t1.isAlive());//start()之后才是活动状态-true
}
3)sleep()线程休眠
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
try {
Thread.sleep(1000);//线程休眠
Thread t = new Thread();//获取当前线程名称
System.out.println(t.getName()+":"+i);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo2 d2 = new Demo2();
Thread t1 = new Thread(d2);
System.out.println("线程是否活动"+t1.isAlive());//start()之后才是活动状态-false
t1.start();
System.out.println("线程是否活动"+t1.isAlive());//start()之后才是活动状态-true
}
4)setPriority()设置不同的优先级
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo2 d2 = new Demo2();
Thread t1 = new Thread(d2,"线程1");
Thread t2 = new Thread(d2,"线程2");
Thread t3 = new Thread(d2,"线程3");
t3.setPriority(Thread.MAX_PRIORITY);
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.NORM_PRIORITY);
t1.start();
t2.start();
t3.start();
}
5)yield()暂停当前线程,执行其他线程
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
try {
Thread.sleep(1000);
Thread t = Thread.currentThread();//当前线程对象引用
System.out.println(t.getName()+":"+i);
if(i==5){
System.out.println("线程礼让");
Thread.currentThread().yield(); //线程礼让
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo2 d2 = new Demo2();
Thread t1 = new Thread(d2,"线程1");
Thread t2 = new Thread(d2,"线程2");
Thread t3 = new Thread(d2,"线程3");
t1.start();
t2.start();
t3.start();
}
6)join(long millis)方法,等待该线程终止的时间最长为millis毫秒
7)interrupt()中断线程,
8)interrupted()判断当前线程是否中断
创建并启动线程需要
1)定义线程;2)实例化线程;3)启动线程;
定义线程,扩展Thread类,或实现Runnable接口;
2)实例化线程:1)扩展Thread类的线程,则直接new;2)实现Runnable接口的类,则用Thread构造方法,
Thread(Runnable target)
Thread(Runnable target,String name)
Thread(ThreadGroup group, Runnable target)
3)启动线程,run();
扫码关注一起随时随地学习!!!就在洋葱攻城狮,更多精彩,等你来!!