线程的创建之继承Thread类、线程的生命周期、线程常用的方法、currentThread方法详解...

一、线程的创建 
1、如何在自定义的代码中,自定义一个线程呢? 
通过对API文档的查找,java已经提供了对线程这类事物的描述——Thread类。

2、创建线程的第一种方式:继承Thread类。 
1)步骤: 
a)自定义一个类继承Thread类。 
b)重写Thread类的run方法 , 把自定义线程的任务代码写在run方法中 
目的:将自定义代码存储在run方法,让线程运行。每个线程都有自己的任务代码,jvm创建的主线程的任务代码就是main方法中的所有代码, 自定义线程的任务代码就写在run方法中,自定义线程负责了run方法中代码。 
c)创建Thread的子类对象,并且调用start方法开启线程。 
注意:一个线程一旦开启,那么线程就会执行run方法中的代码,run方法千万不能直接调用,直接调用run方法就相当调用了一个普通的方法而已并没有开启新的线程。 
start()方法的两个作用:启动线程,调用run方法。 
举例: 

2)发现运行结果每一次都不同? 
因为多个线程都在获取cpu的执行权。cpu执行到谁,谁就运行。明确一点,在某一个时刻,只能有一个程序在运行。(多核除外)cpu在做着快速的切换,以达到看上去是同时运行的效果。 
我们可以形象把多线程的运行形容为多个线程在互相抢夺cpu的执行权。

这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说的算。

扩展:当CPU符合要求,从单核提高到了双核甚至多核,这时就要看内存的大小了,如果内存过小,则会出现CPU有处理能力,但是内存不足无法提供数据进行处理了。 
所以CPU与内存要做当相辅相成。

3)为什么要覆盖run方法呢? 
Thread类用于描述线程。该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。 
也就是说Thread类中的run方法,用于存储线程要运行的代码。

4)start、run方法对比,是一个易混淆点: 
MyThread mythread = new MyThread(); 
创建好一个自定义线程。 
a)d.start(); 
开启线程并执行该线程的run方法。 
b)d.run(); 
仅仅是对象调用方法。而线程创建了,并没有运行。

二、线程的生命周期状态图: 

三、线程常用的方法: 
1、Thread(String name) 初始化线程的名字 
2、setName(String name) 设置线程对象名 
3、getName() 返回线程的名字 

4、sleep() 线程睡眠指定的毫秒数。 静态的方法, 哪个线程执行了sleep方法代码那么哪个线程睡眠。 

5、currentThread() 返回当前的线程对象,该方法是一个静态的方法。 
注意: 哪个线程执行了currentThread()代码就返回那哪个线程的对象。 

6、 getPriority() 返回当前线程对象的优先级,默认线程的优先级是5。 
7、 setPriority(int newPriority) 设置线程的优先级 
虽然设置了线程的优先级,但是具体的实现取决于底层的操作系统的实现。(最大的优先级是10 ,最小的1 , 默认是5)。 

四、补充:Thread.currentThread()方法详解 
1、返回值Thread[Lucy,6,main]

2、解析: 
1)Lucy:线程名。 
2)6:线程的priority 优先级。 
3)main:线程组的名字。

3、线程组:在Java中每一个线程都归属于某个线程组管理的一员,例如在主函数main()主工作流程中产生一个线程,则产生的线程属于main这个线程组管理的一员。

转载于:https://my.oschina.net/u/204616/blog/1586467

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值