Java 线程

线程状态

线程的五种状态

线程生命周期,总共有五种状态:

1.新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

2.就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

3.运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

4.阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态;

5.根据阻塞产生的原因不同,阻塞状态又可以分为三种:

		a)   等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
		
		b)   同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
		
		c)   其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

6.死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

Thread

  • 源码摘抄
    public class Thread extends Object implements Runnable
    
  • 构造方法
    -Thread()  分配新的 Thread 对象。 
    -Thread(String name)  分配新的 Thread 对象。 
    -Thread(Runnable target) 分配新的 Thread 对象。 
    -Thread(Runnable target, String name)  分配新的 Thread 对象。 
    
  • 常用方法
    -static Thread currentThread()返回对当前正在执行的线程对象的引用。 
    -long getId()返回该线程的标识符。 
    -String getName() 返回该线程的名称。 
    -void run() 如果该线程是使用独立的 Runnable 运行对象构造的 
    -static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠 
    -void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 
    -void stop()已过时。 终止线程。
    
  • 测试
    //这个类用来测试多线程编程的实现方式1 extends Thread
    		public class Test2_Thread {
    			public static void main(String[] args) {
    				//3、让多个线程执行run()的业务
    				//7、"钢铁侠""美队"是自定义的线程名称,自动匹配了含参构造
    				MyThread thread = new MyThread("钢铁侠"); //新建状态
    				//4、启动线程
    				//start()从新建状态变成可运行状态,自动调用run()
    				thread.start();
    				MyThread thread2 = new MyThread("美队"); //新建状态
    				thread2.start();
    				//6、start()和run()都能执行业务,run()只是一个普通的实现方式,并没有多线程编程的特点
    		//		thread2.run();
    				//5、多线程执行具有随机性,结果不能保证
    		//		Thread-1===0
    		//		Thread-0===0
    		//		Thread-1===1
    		//		Thread-0===1
    			}
    		}
    		//1、创建多线程类MyThread 继承Thread类
    		class MyThread extends Thread{
    			//6、修改线程名称Thread(String name) 
    			//使用了父类中构造方法的业务,右键 -- source -- 倒数第二个 -- 选择你想用的 -- ok 
    			public MyThread() {
    				super();
    			}
    			public MyThread(String name) {
    				super(name);
    			}
    			
    			//2、把多线程业务的代码放入run()
    			@Override
    			public void run() {
    				//默认在子类中调用父类的功能,通过super关键字
    				//super.run();
    				for(int i = 0 ; i<10 ;i++) {
    					//getName()获取线程名称
    					System.out.println(getName()+"==="+i);
    				}
    			}
    
    		}
    

Runnable接口

  • 源码摘抄
    public interface Runnable
    
  • 接口里面没有构造方法,不能直接new
  • 常用方法 void run
  • 测试
    //这个类用来测试多线程编程方式2 实现Runnable接口
    		public class Test3_Runnable {
    			public static void main(String[] args) {
    				//3、创建多个线程对象执行任务?
    				MyRunnable my = new MyRunnable();
    				//把接口类型的对象,转成Thread类型,因为想调用Thread的start()启动线程--Thread(Runnable target) 
    				//"jack""rose"是自定义的线程名称
    				Thread thread = new Thread(my,"jack");
    				//4、调用start()启动线程
    				thread.start();
    				Thread thread2 = new Thread(my,"rose");
    				thread2.start();
    			}
    		}
    		//1、创建实现类  实现Runnable接口
    		class MyRunnable implements Runnable{
    			//2、把多线程的业务放在run()
    			@Override
    			public void run() {
    				for (int i = 0; i < 10; i++) {
    					//Thread.currentThread()获取当前正在执行任务的线程对象
    					System.out.println(Thread.currentThread().getName()+"----"+i);
    				}
    			}
    		}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值